學過C的大都認為,指標是一個讓人極其頭疼的點;今天,就由我帶大家領略幾道指標的面試題,
例題一
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
輸出結果:2,5
對于這道題的分析,我想直接用一幅圖來解決:

例題二
struct Test {
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;//創建了一個結構體指標,型別為struct Test{ }*,變數名為p
//已知,struct Test型別的變數大小為20位元組
int main()
{
p=(struct Test*)0x100000;//假設p的值為0x100000
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
輸出結果為:00100014 、 00100001 、00100004
分析:p是結構體型別指標,存放的地址為0x00100000,這個地址加上十六進制數0x1(十進制的1);因為struct Test型別的結構體大小為20位元組,所以這里指標p的步長為20,
因此p+0x1得到00100014; (unsigned long)p把0x00100000轉換為無符號整型,也就是十進制的1048576,加上0x1后變成1048577,再以%p的形式列印,得到0x00100001;
(unsigned int*)p把0x00100000轉換為無符號整型指標型別,p的步長變成4,加上0x1后變成0x00100004;
(這里看不懂的可以看看這篇文章哦)
例題三
int main()
{
int a[4] = { 1,2,3,4 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x,%x", ptr1[-1], *ptr2);
return 0;
}
輸出結果: 4 , 2000000
分析:由于計算機的小端存盤模式,陣列a在記憶體中的存放方式為:

ptr1[-1]等價于*(ptr-1),由于是int型別,所以記憶體訪問權限為4個位元組,所以從指標ptr[-1]處訪問四個位元組,也就是04 00 00 00,由于是小端存盤模式,所以實際上的資料為00 00 00 04,所以以%x(十六進制)輸出得到 0x4;
a是首元素地址,設為0x00000001,將其強制型別轉化為int型,得到十進制數1,加1后得到十進制數2,然后將 2強制型別轉化為int型別,得到整型指標0x00000002,所以int*ptr2=0x00000002,其解參考訪問四個位元組,也就是00 00 00 02,最后以%x輸出得到0x02000000;
注:記憶體中每一個位元組都有一個地址,所以地址+1就是向后偏移一個位元組
例題四
int main()
{
int a[3][2] = { (0,1) ,(2,3), (4,5) };
int* p;
p = a[0];
printf("%d", p[0]);
return 0;
}
輸出結果為:1
分析:陣列初始化里有逗號運算式,其結果是最后一個運算式的結果,所以實際上初始化的內容為{1,3,5,0,0,0};指標p里存放的a[0]是陣列第一行的地址,也是第一行首元素的地址,p[0]等價于*(p+0),也就是對首元素地址進行解參考
然后以%d列印,得到首元素1;
結語
關于指標的題分為兩期講解哦,歡迎關注~~
不知我有沒有講清楚呢?有什么問題歡迎下方留言哦,
//創作不易,點贊評論再走唄by白龍碼
經典指標面試題詳解(下)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260050.html
標籤:其他
