数组名与数组首元素地址的问题
数组名代表了数组首元素的地址,但却并不是首元素的地址,可能都没放在一个存储区。
test.c:char c[10]="aabsdsf";
printf("%s\n",c);
printf("%p\n",c);
printf("%p\n",c[0]);
printf("%p\n",c[1]);
printf("%p\n",c[2]);
printf("%p\n",c[3]);
printf("%p\n",c[4]);
结果c[0]与c[1]的地址值一样,而c[1]与c[2]地址差1个字节,与c[3]差18个字节,这正好是a--s之间ASICC的距离。不是又说数组分配的是一段连续的内存吗?为什么会出现这般呢。对于一个已赋值的字符数组,在内存中又是怎么存储的呢?还有字符数组名可不可以理解成一个指针,它里面存的是数组首元素的值?新手上路,实在不懂,求指导。
[解决办法]
你这个后面几个打得不是地址亲,printf("%p\n",&c[0]);
printf("%p\n",&c[1]);
printf("%p\n",&c[2]);这才是地址,你这样的打的意思是将c[0]的ASC码转换成p类型的
,也就是指针类型的,所以差了ASC码的大小,懂了吗亲
[解决办法]
第一,关于数组名
数组是一个独立的类型,数组名就是一个变量的名称,对这个数组取地址就是对这个变量取地址
数组是由元素构成的,在内存中数组占用的内存就是这些元素占用的内存,因此数组的地址(地址就是变量在内存中占用的第一个字节的序号)就是数组内第一个元素的地址
C/C++语法中几乎没有对数组整体的操作方法,只有初始化时可以整体初始化。因此,在使用中,数组名一般被隐式转换为“指向第一个元素的指针”。顺便说一下,a[b]这种最常用的数组用法,实际上是指针的用法,a[b]==*(a+b)==b[a]
第二,关于输出
你输出的是元素不是指针,两个a当然相等
用什么格式输出,和输出什么数据,两者完全独立,别以为用了%p,printf就会把c[1]转换成&(c[1])