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