&a和a的區別


當我們定義一個數組a時,編譯器根據指定的元素個數和元素的類型分配確定大小(元素類型大小*元素個數)的一塊內存,並把這塊內存的名字命名為a。名字a一旦與這塊內存匹配就不能改變。a[0],a[1]等為a的元素,但並非元素的名字。數組的每一個元素都是沒有名字的。

這里&a[0]和&a到底有什么區別呢?a[0]是一個元素,a是整個數組,雖然&a[0]與&a的值一樣,但其意義不一樣。前者是數組元素的首地址,而后者是數組的首地址。以指針的形式訪問和以下標的形式訪問時,記住偏移量的單位是元素的個數而不是byte數,在計算新地址時千萬別弄錯了。

通過下面的例子來看:

#include<iostream>

using namespace std;

int main()

{

int a[5]={1,2,3,4,5};

int* ptr=(int*)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

system("pause");

return 0;

}

答案:2,5

解析:

int* ptr=(int*)(&a+1);&a為數組a的首地址,對指針加1操作,得到的是下一個元素的地址,而不是原有地址值直接加1,所以&a+1則為&a的首地址加5*sizeof(int),顯然當前指針已經超過了數組的界限。將上一步計算出來的地址,強制轉換成int*類型,賦給ptr。

*(a+1);a,&a的值是一樣的,但意思不一樣。a是數組首元素的首地址,也就是[0]的首地址,a+1是數組下一個元素的首地址,即a[1],&a+1是下一個數組的首地址。所以輸出2

*(ptr-1);因為ptr是指向a[5],並且ptr是int*類型,所以*(ptr-1)是指向a[4],輸出5。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM