面試時遇到這樣一道題,面試官在紙上寫下這樣一段**,讓我說一下對應的輸出是什麼
#include
using
namespace
std;
int main(int argc, char
const *argv)
; cout
<< *a << endl;
cout
<< *(a + 1) << endl;
cout
<< *((int *)(&a + 1) - 1) << endl;
return
0;}
這裡主要涉及到乙個概念,就是陣列名與陣列名取位址的區別,
首先用一段**做個試驗。
#include
using
namespace
std;
int main(int argc, char
const *argv)
; cout
<< a << endl;
cout
<< &a << endl;
int *p = new
int[6];
cout
<< p << endl;
cout
<< &p << endl;
return
0;}
輸出結果:
$ ./a.out
0x7fff541ed970
0x7fff541ed970
0x7fbbb24005b0
0x7fff57366918
如果簡單的認為arr就是乙個指向陣列首位址的指標的話,那麼很自然會想到&arr得到的是乙個指向存放arr這個指標的指標,也就是乙個二級指標,然而事實卻並不是這樣。
我們可以看到,這裡pointer這個指標確實如我們所想指向了不同的位址,但是,arr這個陣列名的表現卻和指標不同,arr和&arr指向的位址是一樣的。
這裡便體現除了陣列名和指標的乙個不同之處:對陣列名進行&操作,並不是取其位址,而是得到了指向整個陣列的指標。也就是說,arr與&arr指向的是同乙個位址,但是他們的型別不一樣。arr相當於&arr[0],型別是int *,而&arr是指向整個陣列的指標,型別是int (*)[6]。
有了上面這些理論,面試官提出的**輸出結果應該是
$ ./a.out01
5
解釋一下為什麼第三行輸出5,因為&a表示的是乙個指向一整個陣列的指標,+1操作後向後移動6個int長度,此時指標指向陣列最後乙個元素5的後乙個位置,之後轉型為指向 int的指標,這時進行減1操作就會指向陣列中最後乙個元素5 C語言的陣列名和對陣列名取位址
相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...
C語言的陣列名和對陣列名取位址
相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...
C語言的陣列名和對陣列名取位址
相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...