c++数组名,数组地址和指针

╰+攻爆jí腚メ 2022-02-26 12:50 285阅读 0赞

今天在牛客网上遇到一道神奇的题目:

下面代码的输出结果是?

  1. void main(void)
  2. {
  3. int a[5]={1,2,3,4,5};
  4. int *ptr=(int *)(&a+1);
  5. printf("%d,%d",*(a+1),*(ptr-1));
  6. }

这么一个大坑,我当然做错了,后来在vs上调试:

  1. void fun()
  2. {
  3. int a[5] = { 1, 2, 3, 4, 5 };
  4. printf("address a: %d\n", a);
  5. printf("address a+1: %d\n", a + 1);
  6. printf("address &a: %d\n", &a);
  7. printf("address &a+1: %d\n", &a + 1);
  8. int *ptr = (int *)(&a + 1);
  9. printf("%d, %d", ptr, ptr - 1);
  10. printf("%d, %d", *(a + 1), *(ptr - 1));
  11. }
  12. int main()
  13. {
  14. fun();
  15. system("pause");
  16. }

在这里插入图片描述
在 a==&a 中可以看出,数字a的名字就是a的地址,同时a==&a[0]
但是也可以看出a+1 != &a+1,当a+1的时候,加的是sizeof(int)即4个字节,而&a+1的时候,加的值为sizeof(a),即20个字节

由于ptr为指向int类型的指针,所以ptr + 1加大值毫无疑问是4

同时,我们也可以很明显地看到指针和数组名其实也是不太一样的。

  1. 对数组名取&和对指针取&的意义不同
  2. 当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,对指针sizeof得到的是指针类型的字节数

发表评论

表情:
评论列表 (有 0 条评论,285人围观)

还没有评论,来说两句吧...

相关阅读