c/C++ 指针面试习题
小弟有个关于C语言指针的问题?
原题是:
int array[5] = {1,2,3,4,5};
int *ptr = (int*)(&array+1);
cout << *(array+1) << " " << *(ptr-1) << endl;
我不明白的是:&array+1 是什么意思?以前没有接触过,所以不明白,希望大神来解答。
指针,C?,C++
[解决办法]
&array是指针的指针,即为变量array的地址。&array+1实际上是加上5个int的长度,因为array的类型是int[5],所以最后的输出是2和5
[解决办法]
一楼已经说了,&array得到的指针是一个指向有5个元素的数组指针,该指针加1偏移了5*sizeof(array[0]),所以ptr实际指向了array[5]的下一个元素,ptr-1指向了array[5]
[解决办法]
考察类型:
T* p;
p + i; //等价于(T*)((char*)p + i * sizeof(t))
&aray的类型为 int (*)[5]
希望你能自己得到答案了。
[解决办法]
这个题目其实考的就是指针的偏移大小
[解决办法]
&取地址,取过地址后再加上sizeof(int)的大小。
[解决办法]
[解决办法]
因为表达式&array+1的结果的数据类型是 int(*)[5]
[解决办法]
1.int类型在32位机上,为4位,如:int array = 1; sizeof(array)=4。
所以int array[] ={1,2,3,4,5}; 这是5个int型,sizeof(array)=20;
2.array的地址内存表示:0x00000001,0x00000002,0x00000003,0x00000004 =1
0x00000005,0x00000006,0x00000007,0x00000008 =2
0x00000009,0x0000000a,0x0000000b,0x0000000c =3
0x0000000d,0x0000000e,0x0000000f,0x00000010 =4
0x00000011,0x00000012,0x00000013,0x00000014 =5
0x00000015,0x00000016,0x00000017,0x00000018 =未知
3.array为array[0]的首地址0x00000001,array+1为array[1]的首地址0x00000005,以int的4字节大小相加以此类推。
4.&array是array[]的首地址0x00000001,但array[]为20字节,所以&array+1的首地址为0x00000015。
5.array是以int为大小,&array是以array[]的大小,编译器它要这样。。。理解不了就反驳为什么不这样,反驳不了你就懂了
[解决办法]
&(array+1) or (&array) + 1 ?
[解决办法]
正解
[解决办法]
+1
这个已经解答了。
&array是一个指针,指向数组array的地址。array+1 就是在数字的地址上便宜一个int的地址,就是2
*(ptr-1)想让于 *((*array)-1),就是array的最后一个元素 5
[解决办法]
指针的问题想明白了就觉得很简单的希望楼主加油

[解决办法]
目测结果是 2和5