刚刚那个int a[5]; int (*b)[];b=a;问题的想法

clinkzlol 2010-06-29 03:58:21
之前看到一个帖子,问下面这个代码怎么被报错:

int a[5];
int (*b)[];
b = a;


其实这样写如果在GCC下编译的话不会报错,不过会有类型匹配的警告之类的东西。

不过如果代码改成这个样子:

int a[5] = {1,2,3,4,5};
int (*b)[2];
b = a;
printf("%d\n", *((int *)(b+1)));

运行之后会发现不是2,而是3
这个就关系到数组与指针之间的联系与区别了。
数组名其实只是代表一个地址,那个地址就是数组的首地址。
而指针是一个空间,比如在32位机上一般是4B,里面存放的是指向的空间的地址。
b = a;
这个操作,就是把b这个空间里面的东西变成a (a就是一个地址,是个32位的值,可以理解为0x....)
但是b声明的时候是告诉编译器b指向一个数组,这个数组有2个int元素。
所以b+1操作,相当于b里面的值加上了 2*sizeof(int)。
大概就是这样了。
...全文
98 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
swl82560397pq 2010-06-29
  • 打赏
  • 举报
回复
这种操作很危险,会越界啊。
如果要输出第二个值的话
可以
printf("%d\n",*((*b)+1));
太乙 2010-06-29
  • 打赏
  • 举报
回复
赞lz~~
  • 打赏
  • 举报
回复
此帖不错,得顶..
lylm 2010-06-29
  • 打赏
  • 举报
回复
运行之后会发现不是2,而是3
这个就关系到数组与指针之间的联系与区别了。
数组名其实只是代表一个地址,那个地址就是数组的首地址。
而指针是一个空间,比如在32位机上一般是4B,里面存放的是指向的空间的地址。
b = a;
这个操作,就是把b这个空间里面的东西变成a (a就是一个地址,是个32位的值,可以理解为0x....)
但是b声明的时候是告诉编译器b指向一个数组,这个数组有2个int元素。
所以b+1操作,相当于b里面的值加上了 2*sizeof(int)。
大概就是这样了
>>你的理解是对的
huanmie_09 2010-06-29
  • 打赏
  • 举报
回复
在vs下会报错,类型无法匹配,赋值时将a强制转型即可:
b = (int (*)[2])a;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧