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
同时,我们也可以很明显地看到指针和数组名其实也是不太一样的。
- 对数组名取&和对指针取&的意义不同
- 当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,对指针sizeof得到的是指针类型的字节数
还没有评论,来说两句吧...