重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
舉個簡單例子
int * a[5] //指針數組
int (*a)[5] //數組指針
因為優先級關系是:**( ) >[ ] >***
指針數組沒有(),所以先看a[5]是一個數組,*表示這是一個指針類型的數組。
第二個先看(*a),說明這是一個指針,后面的 [5] 表示數組,指針指向這個數組。
int * a[5]是指針數組,本質上是一個數組,數組里存放的元素是指針,指針的類型是int *型,指向一個整型數。
int ( * a)[5]是數組指針*,本質上是一個指針,指針所指對象是一個數組,數組的類型是int [5]型。
數組指針與指針數組的用法
數組指針與指針數組兩個用的比較多的還是數組指針。
指針數組
char *arr[4] = {"hello", "world", "shannxi", "xian"};
//arr就是定義的一個指針數組,它有四個元素,每個元素是一個char *類型的指針,這些指針存放著其對應字符串的首地址。
數組指針
int a[5]={1,2,3,4,5};
int (*p)[5]=NULL;
p=&a;
首先應該知道的是數組名可以代表兩種含義:①數組首元素地址②整個數組。
顯然在給數組指針賦值時,用到了②這個含義,取地址后代表了整個數組的地址,賦給了數組指針p,此處雖然和只寫一個a時所代表的值一樣,但其意義卻不一樣(主要體現在他的類型上,代表的是一整個一維數組的地址,要賦給一個數組的指針)。
int i;
for(i=0;i<5;i++)
{printf("%d ",*(*p+i));//遍歷輸出數組的值
}
可以通過數組指針訪問數組元素的值,值得注意的是,此處并沒有對指針p的數組指向進行操作,而是直接對p進行了取值,表示的意思就是直接取這個數組,因為指針在訪問連續內存空間的時候才顯得有意義,如果是一維數組,p+1就會越界。所以我們一般不將數組指針用于一維數組,更多的是用在二維數組。
int a[2][3]={1,2,3,4,5,6};
int (*p)[3]=NULL;
p=a;
int (*p)[3]中的3,此處寫的是二維數組的列數,亦或者是每個一維數組的元素個數。
通過比較一維數組和二維數組給p賦值,不難發現,兩者有差別,因為二維數組的數組名a的類型就是int (*)[N],類型相同,所以可以直接賦值。
int i,j;
for(i=0;i<2;i++)
{for(j=0;j<3;j++)
{printf("%d ",*(*(p+i)+j));//遍歷輸出
}
}
對于*(*(p+i)+j) ,一個通俗的理解,里層 * 是為了先選定第幾行,取數組,然后外層 * 再對數組中的元素取值,i,j分別是兩次取值的偏移量。我們說對數組指針對二維數組才有意義,其意義主要體現在里層的p+i上,可以通過移動p,訪問連續的不同一維數組。
總之, 二維數組 *( *(a+i)+j)和a[i][j] 等效
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧