指針數組怎么創建?
創建:
(1)聲明一個數組,聲明時用常量表達式指定數組維數,然后可以用數組名訪問數組元素。
(2)聲明一個變長數組,聲明時用變量表達式指定數組維數,然后用數組名來訪問數組元素。
(3)聲明一個指針,調用malloc(),然后使用該指針來訪問數組元素。malloc接受一個參數:所需內存字節數。然后malloc()找到可用內存中一個大小合適的塊。內存是匿名的;也就是說,malloc()分配了內存,但沒有為它指定名字。然而,它卻可以返回那塊內存第一個字節的地址。因此,可以把那個地址賦值給一個指針變量,并使用該指針來訪問那塊內存。因為char代表一個字節,所以傳統上曾將malloc()定義為指向char的指針類型。然而,ANSI
C標準使用了一個新類型:指向void的指針。這一類型被用作“通用指針”。函數malloc()可用來返回數組指針、結構指針等等,因此一般需要把返回值的類型指派為適當的類型。如果malloc()找不到所需的空間,它將返回空指針。我們使用malloc()來創建一個數組,可以在程序運行時使用malloc()請求一個存儲塊,另外還需要一個指針來存放該塊在內存中的位置。例如,考慮以下代碼:
double * ptd;
ptd = (double
*)malloc(30*sizeof(double));
使用第二種或第三種方法可以做一些用普通的數組聲明做不到的事;創建一個動態數組(dynamic
array),即一個在程序運行時才分配內存并可在程序運行時選擇大小的數組。例如,假定n是一個整數變量。在C99之前,不能這樣做:
double item[n]; /*如果n是一個變量,C99之前不允許這樣做*/
然而,即使在C99之前的編譯器中,也可以這樣做:
ptd=(double
*)malloc(n*sizeof(double));
變長數組VLA和malloc的用法有兩點區別。一個區別在于VLA是自動存儲的。自動存儲的結果之一就是VLA所用內存空間在運行完定義部分之后會自動釋放。因此不必使用free()。另一方面,使用由malloc()創建的數組不必局限在一個函數中。例如,函數可以創建一個數組并返回指針,供調用該函數的函數訪問。接著,后者可以在它結束時調用free()。free()可以使用不同于malloc()指針的指針變量;必須一致的是指針中存儲的位置。
用法:
//注意指針數組和數組指針分別是如何指向二維數組的
#include
<stdio.h>
main()
{
static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int (*p)[4];//數組指針 p是指針,指向一維數組,每個一維數組有4個int元素*p是個數組的地址,**p就是數組元素了
int i,j;
int *q[3];//指針數組 q是數組,數組元素是指針,3個int指針
p=m; //p是指針,可以直接指向二維數組
printf("--數組指針輸出元素--\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("--指針數組輸出元素--\n");
for(i=0;i<3;i++)
q[i]=m[i];//q是數組,元素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");
}