C語言陣列名取位址

2021-07-23 08:54:28 字數 1362 閱讀 1772

面試時遇到這樣一道題,面試官在紙上寫下這樣一段**,讓我說一下對應的輸出是什麼

#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語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...