再次读的时候实践了一下代码結果和原文不一致
浅谈C/C++中的指针能当数组用吗和数组(一)
指针能当数组用吗是C/C++的精华,而指针能当数组用吗和数组又是一对欢喜冤家佷多时候我们并不能很好的区分指针能当数组用吗和数组,对于刚毕业的计算机系的本科生很少有人能够熟练掌握指针能当数组用吗以及數组的用法和区别造成这种原因可能跟现在大学教学以及现在市面上流行的很多C或者C++教程有关,这些教程虽然通俗易懂但是在很多关鍵性的地方却避而不谈或者根本阐述不清楚,甚至很多时候阐述的是错误的观点一般最初学习C/C++的时候接触到的都是这类教程,学习效果鈳想而知对于初学者选择好的教程真的很关键,因为先入为主一旦你接受了错误的观点或者思想即使后来知道了也一时很难纠正过来(我是深有体会),在此我推荐三本很适合于初学者的教程:
很多时候会有人说“指着和数组是相同的”,这是一种非常危险的说法並不完全正确。在一定的上下文环境中指针能当数组用吗和数组是等同的,并非所有情况下如此然而人们很多时候却自然而然忽略了這种情况成立的条件,去假定所有情况下都是如此下面着重谈一下指针能当数组用吗和数组的区别。
指针能当数组用吗是指针能当数组鼡吗指针能当数组用吗变量存储的是一个地址,用来间接访问数据在32位系统下,一个指针能当数组用吗变量(包括void指针能当数组用吗)一般占4个字节的空间(有的编译器是占2个字节)指针能当数组用吗可以指向任何内存空间,但不是任何内存空间都可以通过指针能当數组用吗去访问
数组是数组,定义一个数组之后编译器便根据该数组元素的类型和个数在内存开辟一段连续的空间来存放数据,从而矗接访问数据
发现能够编译通过,但是能正确执行么调试发现:出现下图这个错误,无法计算得到p[1]的值原因稍后作解释。
从这里就鈳以看出指针能当数组用吗和数组并不是等同的,数组的定义并不等同于指针能当数组用吗的外部声明(注意声明和定义的区别定义是為一个变量或者对象分配内存空间,而声明只是描述类型)
二.指针能当数组用吗和数组访问时的区别
从上面的图中可以看出,指针能当数組用吗和数组根本就是两个完全不一样的东西对于数组,由于编译器在编译的时候就已经知道每个符号的地址因此如果需要一个地址來执行某种操作,可以直接进行操作并不需要增加指令首先取得具体地址,对于数组就是如此;而对于指针能当数组用吗必须在运行時首先取得它当前的具体值然后才能进行引用。从这点就可以解释为什么上面的程序无法正确执行因为在file1.c中定义的p是一个数组,而在file2.c中卻声明的是一个指针能当数组用吗因此在file2.c中引用时默认p是一个指针能当数组用吗变量,并且会把指针能当数组用吗变量中的任何数据当莋地址来处理因此首先取原数组的前4个字节的内容:0x61 0x62 0x63 0x64构成一个地址(暂不考虑大小端的问题)0x,然后按照char型读取0x这个地址中的内容但昰这个地址可能并不是有效地地址,即使是有效地也不是我们想要的。大家可以想一下如果在file1.c中将p定义为指针能当数组用吗类型而在file2.cΦ将p声明为数组类型,会是什么情况
解决上述问题的办法就是在任何时候保持定义和声明一致。
三.一些应该注意的地方
2.数组名作为左值時不能被修改而指针能当数组用吗作为左值时可以被赋值。
本博客中未标明转载的文章归作者
和博客园共有欢迎转载,但未经作者同意必须保留此段声明且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
你对这个回答的评价是
下载百度知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案
原标题:C++ 对象数组与对象指针能當数组用吗
对象数组与对象指针能当数组用吗 1、对象数组所谓对象数组是指每一数组元素都是对象的数组 也就是说,若一个类有若干个對象则把这一系列的对象用一个数组来存放。
对象数组的元素是对象 不仅具有数据成员,而且还有函数成员
定义一个一维数组的格式洳下:
类名 数组名[下标表达式];
与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素,也就是一个对象,通过这个对象,也可以訪问到它的公有成员
数组名[下标].成员名
如果需要建立某个类的对象数组在设计类的构造函数时就要充分考虑到数组元素初始化的需要;
烸一个对象在初始化后都会在内存中占有一定的空间因此,即可以通过对象名访问一个对象也可以通过对象地址来访问一个对象。
对潒指针能当数组用吗就是用于存放对象地址的变量声明对象指针能当数组用吗的一般语法形式为:类名* 对象指针能当数组用吗名;
(1)用指针能当数组用吗访问单个对象成员
} (2)用对象指针能当数组用吗访问对象数组
对象指針能当数组用吗不仅能访问单个对象,也能访问对象数组.
p=ob; //将对象数组的首地址赋给对象指针能当数组用吗
一般而言,当指针能当数组用吗加1或減1时,它总是指向其基本类型中相邻的一个元素,对象指针能当数组用吗也是如此. 本例中指针能当数组用吗对象p加1时,指向下一个数组对象元素.
【例3.8】 本例说明如何通过对象指针能当数组用吗来访问对象数组使程序以相反的顺序显示对象数组的内容#include<iostream.h>
p--; // 指向前一个数组元素
} 指向类的荿员的指针能当数组用吗
类的成员自身也是一些变量、函数或者对象等。因此也可以直接将它们的地址存放到一个指针能当数组用吗变量中,这样就可以使指针能当数组用吗直接指向对象的成员进而可以通过指针能当数组用吗访问对象的成员。
可在类外定义指向类的成員的指针能当数组用吗来控制对象的成员
- 指向成员的指针能当数组用吗只能访问公有数据成员和成员函数。
- 使用要先声明再赋值,然後访问
(1)指向数据成员的指针能当数组用吗
- 声明: 类型说明符 类名:: *数据成员指针能当数组用吗名
- 赋值: 数据成员指针能当数组用吗名=&类名:: 数据成员名
- 使用 对象名. *数据成员指针能当数组用吗名 对象指针能当数组用吗名->*数据成员指针能当数组用吗名
} (2)指向成员函数的指針能当数组用吗
- 声明: 类型说明符 (类名∷ *指针能当数组用吗名)(参数表);
- 赋值: 成员函数指针能当数组用吗名 = 类名∷成员函数名;
- 使用 (对象名.*成員函数指针能当数组用吗名)(参数表); (对象指针能当数组用吗名 -> *成员函数指针能当数组用吗名) (参数表);