数组和指针(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])

 

 

 

猜你喜欢

转载自www.cnblogs.com/9527s/p/10806065.html