回 帖 发 新 帖 刷新版面

主题:请教char数组与char指针的区别

先写一个范例
[code=c]
char a[3] = {1,2,3};
char* b = a;
printf("%d,%d\n",a,b);
printf("%d,%d\n",sizeof(a),sizeof(b));
printf("%d,%d\n",a[0],b[0]);
[/code]

我对char数组和char指针就搞得不是很清了。
数组名本身就是数组首地址,那么它就应该是个指针吧?我打印他们的数值是相等的,
b指针也可以当数组名用,a数组名可以当指针用
但是sizeof时又是不等的,
这时,我就搞不懂,数组名到底是一个什么东西。这里是否与sizeof的机制有关系呢?
望各位大虾给解释一下,a和b的最根本区别,一个是指针一个是数组的话就不要说了。

回复列表 (共17个回复)

11 楼



首先感谢你的回帖。
道理不辨不明,由于前些天回老家,没有及时回帖,深表歉意。

对于你的看法,我有些不理解,对于你给出的a == b的例子,你的a和b都是自己赋的值,没有任何关系,可以令a!=b,但是如何令数组名不等于数组首地址呢?他们之间有什么内在的联系,或者按你的说法数组名和首地址是如何进行值的传递的?

12 楼

[quote]数组名本身就是数组首地址
--- 瞎扯,数组名就是数组名

我打印他们的数值是相等
--- 数值相等,只代表数值相等,不代表其它任何意义
比如 int a=1, b=1。
此时 a 和 b 数值相等,能代表a就是b吗?
比如 int a=0; char& b=*(char*)&a;
此时 a 和 b 数值相等,且 &a 和 &b 数值也相等,能代表a就是b吗?

b指针也可以当数组名用
--- 瞎扯,只能说在部分场合下 指针 和 数组 行为一致。[/quote]


`````````````````````````````
首先感谢你的回帖。
道理不辨不明,由于前些天回老家,没有及时回帖,深表歉意。

对于你的看法,我有些不理解,对于你给出的a == b的例子,你的a和b都是自己赋的值,没有任何关系,可以令a!=b,但是如何令数组名不等于数组首地址呢?他们之间有什么内在的联系,或者按你的说法数组名和首地址是如何进行值的传递的?

13 楼

[quote]数组名本身就是数组首地址
--- 瞎扯,数组名就是数组名

我打印他们的数值是相等
--- 数值相等,只代表数值相等,不代表其它任何意义
比如 int a=1, b=1。
此时 a 和 b 数值相等,能代表a就是b吗?
比如 int a=0; char& b=*(char*)&a;
此时 a 和 b 数值相等,且 &a 和 &b 数值也相等,能代表a就是b吗?

b指针也可以当数组名用
--- 瞎扯,只能说在部分场合下 指针 和 数组 行为一致。[/quote]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
还有一个问题,就是  部分场合下指针和数组行为一致,
那可否给举个范例证明 不一致的情况呢?

14 楼

[quote][quote]数组名本身就是数组首地址
--- 瞎扯,数组名就是数组名

我打印他们的数值是相等
--- 数值相等,只代表数值相等,不代表其它任何意义
比如 int a=1, b=1。
此时 a 和 b 数值相等,能代表a就是b吗?
比如 int a=0; char& b=*(char*)&a;
此时 a 和 b 数值相等,且 &a 和 &b 数值也相等,能代表a就是b吗?

b指针也可以当数组名用
--- 瞎扯,只能说在部分场合下 指针 和 数组 行为一致。[/quote]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
还有一个问题,就是  部分场合下指针和数组行为一致,
那可否给举个范例证明 不一致的情况呢?[/quote]

比如指针可以使用++操作符,数组名不可以

15 楼

[quote]int a[10];
int *p=a;
int *q=&a;
a 是数组元素的首地址,&a 是整个数组的首地址 (虽然它们的值相同,但意义不同)
可以试一下 p+1 和 q+1 区别
数组和指针之间没有关系,只不过有时是指向同一块内存,操作起来差不多[/quote]
 p+1 和 q+1 有区别吗?我试过了,包括和a+1都是没有区别的,都是指向数组的第二个元素。
只有在超过一维的数组里,例如:
a[2][10];
int *p=a;
int *q=&a;
a+1和p+1是不同的,a+1指向第二个包含10个整数元素的数组的首地址,而p+1和q+1都是指向数组的第一个10个整数元素数组的第二个元素。a是整个数组的首地址,同时*a是指向第一个10个整数元素数组的首地址,而两者是相同的,也就是c的数值和*c的数值是相同的,而**c则是间接引用第一个10个整数元素数组的首元素,也 就是a[0][0];而这时,*p和*q的值都是a[0][0],*(p+1)和*(q+1)的值是a[0][1];而*(c+1)=c[1], *(p+10)=*(q+10)=a[1][0]=**(a+1)=*a[1]。

16 楼

数组申请一个连续的空间,既然是申请一个连续的内存空间(逻辑上理解是连续的,实际的话还有一定的出入,操作系统的原因你申请的空间未必是连续的),那肯定要有大小,长度。数组名就是这个连续空间的首地址,标识这个连续内存空间的开始。所以当你sizeof的时候是取到这个连续空间的大小。
而指针是申请了一个存放地址的变量,所以sizeof的时候int型大小,因为一个int型大小足够放下任何地址了!
而你将a赋给char *b,相当与将一个地址保存到指针变量里,而通过这个指针变量你能访问到保存在变量里的地址的内存。但是使用这个指针变量访问内存要谨慎,因为你可以通过指针变量访问*(b+5)这个内存(超过你定义的数组下标了,它还是能访问,严重的话会导致你的程序就这样挂掉,因为能够写内存),而数组只到a[4]。而你说b[0]和a[0]是相等的,因为通过指针变量你间接访问到了数组的首地址!其实指针变量的话可以写成*(b+0),*(b+1)....来访问数组内存!数组与指针在某些场合是相同的,有的场合是不同的,想要继续了解的话,我推荐你看《C专家编程》里的<指针与数组>这章!

17 楼

老兄,你把数组的类型换成int型,再试试就明白sizeof后的数值为什么不一样了。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册