Bootstrap

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

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

下面代码的输出结果是?

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

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

void fun()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	printf("address a:    %d\n", a);
	printf("address a+1:  %d\n", a + 1);
	printf("address &a:   %d\n", &a);
	printf("address &a+1: %d\n", &a + 1);

	int *ptr = (int *)(&a + 1);
	printf("%d, %d", ptr, ptr - 1);
	printf("%d, %d", *(a + 1), *(ptr - 1));
}

int main()
{
	fun();
	system("pause");
}

在这里插入图片描述
在 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得到的是指针类型的字节数
;