數(shù)組指針(也稱行指針)定義 int (*p)[n];()優(yōu)先級高,首先說明p是一個指針,指向一個整型的一維數(shù)組,這個一維數(shù)組的長度是n,也可以說是p的步長。也就是說執(zhí)行p+1時,p要跨過n個整型數(shù)據(jù)的長度。
如要將二維數(shù)組賦給一指針,應(yīng)這樣賦值:int a[3][4];int (*p)[4]; //該語句是定義一個數(shù)組指針,指向含4個元素的一維數(shù)組。p=a; //將該二維數(shù)組的首地址賦給p,也就是a[0]或&a[0][0]p++; //該語句執(zhí)行過后,也就是p=p+1;p跨過行a[0][]指向了行a[1][]
所以數(shù)組指針也稱指向一維數(shù)組的指針,亦稱行指針。
指針數(shù)組定義 int *p[n];[]優(yōu)先級高,先與p結(jié)合成為一個數(shù)組,再由int*說明這是一個整型指針數(shù)組,它有n個指針類型的數(shù)組元素。這里執(zhí)行p+1時,則p指向下一個數(shù)組元素,這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指針變量可以用來存放變量地址。但可以這樣 *p=a; 這里*p表示指針數(shù)組第一個元素的值,a的首地址的值。如要將二維數(shù)組賦給一指針數(shù)組:int *p[3];int a[3][4];p++; //該語句表示p數(shù)組指向下一個數(shù)組元素。注:此數(shù)組每一個元素都是一個指針for(i=0;i<3;i++)p[i]=a[i]這里int *p[3] 表示一個一維數(shù)組內(nèi)存放著三個指針變量,分別是p[0]、p[1]、p[2]所以要分別賦值。
這樣兩者的區(qū)別就豁然開朗了,數(shù)組指針只是一個指針變量,似乎是C語言里專門用來指向二維數(shù)組的,它占有內(nèi)存中一個指針的存儲空間。指針數(shù)組是多個指針變量,以數(shù)組形式存在內(nèi)存當(dāng)中,占有多個指針的存儲空間。還需要說明的一點就是,同時用來指向二維數(shù)組時,其引用和用數(shù)組名引用都是一樣的。比如要表示數(shù)組中i行j列一個元素:*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
優(yōu)先級:()>[]>*
1. 定義方式不同:指針數(shù)組是一個元素為指針類型的數(shù)組,而數(shù)組指針是一個指向數(shù)組的指針。
2. 數(shù)據(jù)類型不同:指針數(shù)組中每個元素都是一個指針,而數(shù)組指針本身是一個指向特定類型數(shù)據(jù)的數(shù)組。
3. 訪問元素不同:在訪問指針數(shù)組時,需要首先訪問該元素所在的位置,然后使用間接引用操作符(*)來訪問該元素所指向的值;在訪問數(shù)組指針時,可以直接使用下標操作符[]訪問其所指向的數(shù)組中的元素。
4. 內(nèi)存布局不同:對于指針數(shù)組,每個元素都是一個獨立的內(nèi)存位置,其值存儲了相應(yīng)對象或變量地址;而對于數(shù)組指針,它本身也是一個變量,并且存儲了整個數(shù)組的地址。
1 數(shù)組指針和指針數(shù)組都是指向數(shù)組的指針,但是它們的定義和用法有所不同。2 數(shù)組指針是一個指向數(shù)組的指針變量,它可以通過指針運算符(*)和下標運算符([])來訪問數(shù)組元素。例如,int (*p)[3]表示一個指向長度為3的int類型數(shù)組的指針。3 指針數(shù)組是一個數(shù)組,它的每個元素都是一個指針,每個指針可以指向不同類型的數(shù)據(jù)。例如,int *a[3]表示一個包含3個int類型指針的數(shù)組。4 因此,數(shù)組指針和指針數(shù)組的區(qū)別在于它們的定義和用法不同,前者是指向數(shù)組的指針變量,后者是一個數(shù)組,它的每個元素都是一個指針。
1 數(shù)組指針是指一個指向數(shù)組的指針變量,指針數(shù)組是指一個數(shù)組,該數(shù)組的元素都是指針類型。2 數(shù)組指針的聲明方式為:類型 (*變量名)[數(shù)組長度];指針數(shù)組的聲明方式為:類型 *變量名[數(shù)組長度];3 數(shù)組指針的使用方式為:可以通過指針運算符*對指針進行間接訪問數(shù)組元素,例如:*arrPtr[0];指針數(shù)組的使用方式為:可以直接訪問數(shù)組元素即指針變量,例如:arrPtr[0]。4 區(qū)別在于數(shù)組指針是指向一個數(shù)組的指針,而指針數(shù)組則是一個數(shù)組,其中每個元素都是指針類型。因此,在使用時需要根據(jù)語境來判斷使用哪種方式。
指針數(shù)組和數(shù)組指針的區(qū)別如下:
1. 定義方式不同:指針數(shù)組是一個元素為指針類型的數(shù)組,而數(shù)組指針是一個指向數(shù)組的指針。
2. 數(shù)據(jù)類型不同:指針數(shù)組中每個元素都是一個指針,而數(shù)組指針本身是一個指向特定類型數(shù)據(jù)的數(shù)組。
3. 訪問元素不同:在訪問指針數(shù)組時,需要首先訪問該元素所在的位置,然后使用間接引用操作符(*)來訪問該元素所指向的值;在訪問數(shù)組指針時,可以直接使用下標操作符[]訪問其所指向的數(shù)組中的元素。
4. 內(nèi)存布局不同:對于指針數(shù)組,每個元素都是一個獨立的內(nèi)存位置,其值存儲了相應(yīng)對象或變量地址;而對于數(shù)組指針,它本身也是一個變量,并且存儲了整個數(shù)組的地址
指針數(shù)組和數(shù)組指針的區(qū)別如下:
1. 定義方式不同:指針數(shù)組是一個元素為指針類型的數(shù)組,而數(shù)組指針是一個指向數(shù)組的指針。
2. 數(shù)據(jù)類型不同:指針數(shù)組中每個元素都是一個指針,而數(shù)組指針本身是一個指向特定類型數(shù)據(jù)的數(shù)組。
3. 訪問元素不同:在訪問指針數(shù)組時,需要首先訪問該元素所在的位置,然后使用間接引用操作符(*)來訪問該元素所指向的值;在訪問數(shù)組指針時,可以直接使用下標操作符[]訪問其所指向的數(shù)組中的元素。
4. 內(nèi)存布局不同:對于指針數(shù)組,每個元素都是一個獨立的內(nèi)存位置,其值存儲了相應(yīng)對象或變量地址;而對于數(shù)組指針,它本身也是一個變量,并且存儲了整個數(shù)組的地址。
數(shù)組指針和指針數(shù)組是兩個不同的概念。
數(shù)組指針是指一個指向數(shù)組的指針,也稱為指向數(shù)組的首元素的指針。它是一個指針變量,存儲的是一個數(shù)組的地址,這個數(shù)組可以是一維或多維數(shù)組。對于一個一維數(shù)組a,其可以用一個指向數(shù)組的指針p來表示,即p=&a[0],p指向a[0],也可以用p[i]來代表a[i],其中i為下標。
而指針數(shù)組則是指一個數(shù)組,這個數(shù)組的每個元素都是指針類型。指針數(shù)組中的每個元素都存儲著一個指針,該指針指向內(nèi)存中的某個位置。每個元素的值是一個地址,用于存儲其他變量的地址。例如,int *a[10]表示一個包含10個元素的數(shù)組,每個元素都是指向int類型的指針變量,也就是說,a[0]、a[1]、a[2]……a[9] 都是指向int類型變量的指針。
因此,數(shù)組指針與指針數(shù)組的本質(zhì)區(qū)別在于它們的類型不同。數(shù)組指針的類型是一個指向數(shù)組的指針,而指針數(shù)組的類型是一個包含指針變量的數(shù)組。在使用上,數(shù)組指針更多用于多維數(shù)組的處理,而指針數(shù)組更多用于動態(tài)內(nèi)存分配和指針傳遞等操作。
一維數(shù)組指針
一維數(shù)組的指針是直接將一維數(shù)組的首地址賦予指針變量,之后通過指針變量的運算逐漸輸出一維數(shù)組中的各個元素的值。
例如:int a[20];
int *p;
因為數(shù)組名相當(dāng)于一個指針指向的就是一維數(shù)組的首地址(例如a[0]),所以可以直接將數(shù)組名賦予指針變量(例如p=a),無需加取地址符&;也可以讓指針變量指向第一個元素的地址(例如p=&a[0]);即p=a與p=&a[0]是等價的
數(shù)組指針存放的是要訪問的內(nèi)存地址。
創(chuàng)建:
(1)聲明一個數(shù)組,聲明時用常量表達式指定數(shù)組維數(shù),然后可以用數(shù)組名訪問數(shù)組元素。
(2)聲明一個變長數(shù)組,聲明時用變量表達式指定數(shù)組維數(shù),然后用數(shù)組名來訪問數(shù)組元素。
(3)聲明一個指針,調(diào)用malloc(),然后使用該指針來訪問數(shù)組元素。malloc接受一個參數(shù):所需內(nèi)存字節(jié)數(shù)。然后malloc()找到可用內(nèi)存中一個大小合適的塊。內(nèi)存是匿名的;也就是說,malloc()分配了內(nèi)存,但沒有為它指定名字。然而,它卻可以返回那塊內(nèi)存第一個字節(jié)的地址。因此,可以把那個地址賦值給一個指針變量,并使用該指針來訪問那塊內(nèi)存。因為char代表一個字節(jié),所以傳統(tǒng)上曾將malloc()定義為指向char的指針類型。然而,ANSI
C標準使用了一個新類型:指向void的指針。這一類型被用作“通用指針”。函數(shù)malloc()可用來返回數(shù)組指針、結(jié)構(gòu)指針等等,因此一般需要把返回值的類型指派為適當(dāng)?shù)念愋汀H绻鹠alloc()找不到所需的空間,它將返回空指針。我們使用malloc()來創(chuàng)建一個數(shù)組,可以在程序運行時使用malloc()請求一個存儲塊,另外還需要一個指針來存放該塊在內(nèi)存中的位置。例如,考慮以下代碼:
double * ptd;
ptd = (double
*)malloc(30*sizeof(double));
使用第二種或第三種方法可以做一些用普通的數(shù)組聲明做不到的事;創(chuàng)建一個動態(tài)數(shù)組(dynamic
array),即一個在程序運行時才分配內(nèi)存并可在程序運行時選擇大小的數(shù)組。例如,假定n是一個整數(shù)變量。在C99之前,不能這樣做:
double item[n]; /*如果n是一個變量,C99之前不允許這樣做*/
然而,即使在C99之前的編譯器中,也可以這樣做:
ptd=(double
*)malloc(n*sizeof(double));
變長數(shù)組VLA和malloc的用法有兩點區(qū)別。一個區(qū)別在于VLA是自動存儲的。自動存儲的結(jié)果之一就是VLA所用內(nèi)存空間在運行完定義部分之后會自動釋放。因此不必使用free()。另一方面,使用由malloc()創(chuàng)建的數(shù)組不必局限在一個函數(shù)中。例如,函數(shù)可以創(chuàng)建一個數(shù)組并返回指針,供調(diào)用該函數(shù)的函數(shù)訪問。接著,后者可以在它結(jié)束時調(diào)用free()。free()可以使用不同于malloc()指針的指針變量;必須一致的是指針中存儲的位置。
用法:
//注意指針數(shù)組和數(shù)組指針分別是如何指向二維數(shù)組的
#include
<stdio.h>
main()
{
static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int (*p)[4];//數(shù)組指針 p是指針,指向一維數(shù)組,每個一維數(shù)組有4個int元素*p是個數(shù)組的地址,**p就是數(shù)組元素了
int i,j;
int *q[3];//指針數(shù)組 q是數(shù)組,數(shù)組元素是指針,3個int指針
p=m; //p是指針,可以直接指向二維數(shù)組
printf("--數(shù)組指針輸出元素--\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("] ",*(*(p+i)+j));
}
printf("\n");
}
printf("\n");
for(i=0;i<3;i++,p++)//p可看成是行指針
{
printf("= ",**p);//每一行的第一個元素
printf("= ",*(*p+1));//每一行的第二個元素
printf("= ",*(*p+2));//每一行的第三個元素
printf("= ",*(*p+3));//每一行的第四個元素
printf("\n");
}
printf("\n");
printf("--指針數(shù)組輸出元素--\n");
for(i=0;i<3;i++)
q[i]=m[i];//q是數(shù)組,元素q[i]是指針
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("= ",q[i][j]);//q[i][j]可換成*(q[i]+j)
}
printf("\n");
}
printf("\n");
q[0]=m[0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("= ",*(q[0]+j+4*i));
}
printf("\n");
}
printf("\n");
}