沒怎麼用過c/c++,今天偶然碰到乙個問題,記錄一下。
int a[3] = ;
cout << a << endl;
cout << &a <
輸出的結果一樣嗎?
答案是一樣,不一樣我也不用寫了。初看起來有點奇怪,因為陣列名是指標,那直覺上&a應該是對a這個指標變數取位址,所以結果應該是不一樣,這是為什麼?
原來實際上,a是指向a[0]的指標,而&a是指向整個陣列的指標。
有點拗口,指向整個陣列的指標當然是指向整個陣列的起始位址,也就是a[0],所以a和&a的值是一樣的,但是這裡注意,雖然他們的值是一樣的,但是他們所代表的的含義卻是不同的,就像假如char*指向0025f88c這個位址,再用乙個int*也指向0025f88c,雖然這兩個指標的值一樣,但是乙個char指標,乙個是int指標,對這兩個指標進行加減表示的含義是不同的,寫同樣的**給他們都+1,char指標只移動了乙個位元組,而int指標會移動4個位元組,同理,&a+1相當於移動了sizeof(a)個位元組。
那麼,看下面的語句:
int a[3] = ;
cout << *( (int*)(&a + 1)-1 ) 《輸出是什麼?自己試試吧
C語言的陣列名和對陣列名取位址
相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...
C語言的陣列名和對陣列名取位址
相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...
C語言的陣列名和對陣列名取位址
相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...