数组和指针(sizeof两者的关系)
《c和指针》还有对其他博客的参考
数组很常见,int b[4]中 b[4]是整形,b类型是什么呢?
正常思考方式,b应该是表示整个数组,但是我们使用数组名字b的过程中,几乎所有都是一个指针常量,就是数组第一个元素的地址,即&b[0]
但不要以此以为数组和指针是相同的。
只有在两种场合下,数组名不用指针常量表示,其他都是一个常量指针,也称为数组的 “退化” 。两种场合为:
1: sizeof(b)
2: &b
第一种举例:
1 int b[4] = {0};
2 printf("%d\n",sizeof(b));
输出结果为16,是整个数组的长度,如果b是常量指针,结果应该是指针地址的长度4,(长度取决于机器)
如果输出sizeof(b)/sizeof(b[0]) 结果是4
第二种: &b,用指针指向b会出错
1 int b[4] = {0};
2 int *p=&b
编译出错显示error: cannot convert 'int (*)[4]' to ’int*‘
不能把整数数组指针赋值给整数指针,说明&b 产生的是一个指向数组的指针;sizeof(&b)的大小是4 就是指针的大小
其他情况b是指&b[0] ,例如
1 #include<stdio.h>
2 int main()
3 {
4 int b[4] = {4,3,2,1};
5 printf("%d %d %d\n",*b+1,*(b+1),*b);
6 }
结果是 5 3 4
*b+1是指 *(&b[0])+1 对首地址指针解引用再加1
*(b+1) 是指 *(&b[0]+1*sizeof(int)) 指针加1的解引用就是b[1]的值 //( 指针+n 是指针后移n*指针指向的类型字节 最好不要超过数组最后一位)
*b = *(&b[0])