1. 程式人生 > 其它 >經典指標面試題詳解(上)

經典指標面試題詳解(上)

技術標籤:指標c語言面試

學過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白龍碼