例1
int main()
; int
*ptr = (int
*)(&a + 1);
printf("%d
%d\n", *(a + 1), *(ptr - 1));
system("pause");
return
0;}
程式結果:2 5
分析:陣列名在sizeof內部單獨出現和&(陣列名)這兩種情況下,陣列名表示整個陣列。
其他情況下,陣列名均表示首元素的位址。
所以這裡的(a+1)的a表示首元素的位址,+1表示下乙個元素的位址,解引用表示下乙個下乙個元素2.
(&a+1)對a取位址,取得是首元素的位址,+1是指向下乙個陣列的起始位址。所以ptr-1指向該陣列的在最後乙個元素,解引用表示該元素5.
這裡區分一下:
struct test
*p;int main()
先來看結果:
分析:p是乙個結構體指標,他的位址我們其實並不關心。這道題考察了對不同型別的+1,到底是加多少。
對p+1:p是乙個指標,對指標+1,加其指向型別的大小。該結構體大小由於記憶體對齊我們可以得到是20,所以16進製制運算得如圖結果。
將p強轉為無符號長整形,對p+1,就是+1。
將p強轉為無符號整形指標型別,對p+1就是加其指向型別的大小,即就是4。
例3:
int main()
; int
*p; p = a[0];
printf("%d", p[0]);
system("pause");
return
0;}
這道題有乙個很容易出錯的陷阱,在定義二維陣列時用了逗號表示式,所以這個二維陣列並不是題目上的資料,而是;
所以p[0]就是該陣列第乙個元素1.
例4
int main()
; int
*ptr1 = (int
*)(&a + 1);
int*ptr2 = (int
*)(*(a + 1));
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
system("pause");
return
0;}
分析:這道題考察了對二維陣列的理解,我們知道陣列在記憶體中是線性連續存放的,所以二維陣列也是如此。
&a+1:與一維陣列同理,所以此時+1指向了下乙個陣列的起始位置,*(ptr1-1)即就是該陣列的最後乙個元素10。
(a+1):指向下乙個元素,這裡需要我們將二維陣列看作一維陣列(該陣列有兩個元素,每個元素是乙個一維陣列),所以a此時表示第乙個元素,+1指向下乙個元素即就是第二個一維陣列的起始,*(ptr2-1)即就是上乙個一維陣列的最後乙個元素5;
例5
int main()
; char **pa = a;
pa++;
printf("%s\n", *pa);
system("pause");
return
0;}
面試題總結 C 語言 指標
面試題總結 c 語言 指標 1.嵌入式系統經常具有要求程式設計師去訪問某特定的記憶體位置的特點。在某工程中,要求設定一據對位址為0x67a9的整形變數的值為0xaa66,編譯器是乙個純粹的ansi編譯器寫帶碼去完成這一任務。注釋 這一問題測試你是否知道為了訪問乙個絕對位址,把乙個整形數強制轉換 yp...
C語言面試題 指標篇(一)
指標的使用,一直是c語言面試題中必考的部分,因為指標本身使用的複雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合,因此我們將會使用五篇專題的篇幅來介紹指標。分析下面的程式,指出程式中的錯誤 include int main void 沒有正確為str分配記憶體空間,將會發生異常。問題出在將...
C語言面試題 指標篇(二)
閱讀下面的程式,找出其中的錯誤,並說明原因。include int main 答案 該程式會段錯誤,因為程式中僅僅只定義 乙個字元指標,並沒有定義字元 只是將字元指標指向 abcd 這個字元 常 而字元 常 abcd 的儲存位置是在 記憶體的資料段 或靜態儲存區 中的,儲存在這個位置的值,是 允許修...