經典指標面試題詳解(上)
學過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;
注:記憶體中每一個位元組都有一個地址,所以地址+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白龍碼