我說明寫在案例的備注里,你參考吧。
巫山ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
#includestdio.h
typedef?struct?st
{
int?id;
}ST,*STP;?//先定義類型???ST是結(jié)構(gòu)類型???STP是結(jié)構(gòu)指針類型
int?main()
{
STP?st[2];//這里st就是你要的結(jié)構(gòu)指針數(shù)組
ST?st1,st2;//這里我定義了2個結(jié)構(gòu)變量,并賦值,讓指針數(shù)組的元素分別指向這兩個變量地址
st1.id=1;st2.id=2;
st[0]=st1;
st[1]=st2;
printf("%d,%d\n",st[0]-id,st[1]-id);//打印指針數(shù)組指向地址內(nèi)容
return?0;
}
1、使用malloc函數(shù),先分配第一維的大小,然后再循環(huán)分配每一維的大小。
2、例程,分配3行4列二維數(shù)組:
#include?stdio.h
#include?malloc.h
int?main()
{
int?**a;
int?i,?j;
a?=?(int**)malloc(sizeof(int*)*3);//為二維數(shù)組分配3行
for?(i?=?0;?i??3;?++i){//為每列分配4個大小空間
a[i]?=?(int*)malloc(sizeof(int)*4);
}
//初始化
for?(i?=?0;?i??3;?++i){
for?(j?=?0;?j??4;?++j){
a[i][j]?=?i+j;
}
}
//輸出測試
for?(i?=?0;?i??3;?++i){
for?(j?=?0;?j??4;?++j){
printf?("%d?",?a[i][j]);
}
printf?("\n");
}
//釋放動態(tài)開辟的空間
for?(i?=?0;?i??3;?++i){
free(a[i]);
}
free(a);
return?0;
}
/*
輸出:
0?1?2?3
1?2?3?4
2?3?4?5
*/
數(shù)組名就是指針,例如:
#include stdio.h
void?pr(char *p)
{
printf(p);
}
void main(void)
{
char s[] = "abc";
pr(s);
}
擴展資料:
注意事項
非數(shù)組類的聲明盡量以指針的方式進(jìn)行比較好。倘若一個指針指向的內(nèi)存并不是一個數(shù)組,那么采用數(shù)組名的聲明方式或許就會給人產(chǎn)生錯誤的引導(dǎo)。類似的,如果指向的是一個數(shù)組區(qū)域,則會給人以更加豐富的信息。例如:
int main(int argc,char* argv[])
{
/* code here */
}
與
int main(int argc,char** argv)
{
/* code here */
}
兩種方式完全等價,但是前面一種能夠更清晰地看出:這個參數(shù)是指向某個元素起始地址的指針,而后面的這種方式則不能夠直觀地看出這種含義。
c語言中,聲明一個指針數(shù)組,char *s[1024 ] ,但并沒有對它初始化,那它里面的數(shù)據(jù)(指針)是不確定的!
如果是全局變量,則里面的指針全是空指針
如果是局部變量,則里面的數(shù)據(jù)是不確定值,就象普通數(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ù)組指針定義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ù)組指針關(guān)系
數(shù)組指針是指向數(shù)組首元素的地址的指針,其本質(zhì)為指針(這個指針存放的是數(shù)組首地址的地址,相當(dāng)于2級指針,這個指針不可移動);指針數(shù)組是數(shù)組元素為指針的數(shù)組,其本質(zhì)為數(shù)組。
例如:*p[2]是指針數(shù)組,實質(zhì)是一個數(shù)組,里面的兩個元素都是指針,[]的優(yōu)先級比*的優(yōu)先級高,p先與[]結(jié)合,形成數(shù)組p[2],有兩個元素的數(shù)組,再與*結(jié)合,表示此數(shù)組是指針類型的,每個數(shù)組元素相當(dāng)于一個指針變量
與二維數(shù)組對比
二維數(shù)組:如char string_1[10][10]只要定義了一個二維數(shù)組,無論賦不賦值,系統(tǒng)都會給他分配相應(yīng)空間,而且該空間一定是連續(xù)的。其每個元素表示一個字符。我們可以通過指定下標(biāo)對其元素進(jìn)行修改。
指針數(shù)組:如char*str_B[5]系統(tǒng)至少會分配5個連續(xù)的空間用來存儲5個元素,表示str_B是一個5個元素的數(shù)組,每個元素是一個指向字符型數(shù)據(jù)的一個指針。
如果我做這樣的定義:
char a[3][8]={"gain","much","strong"};
char*n[3]={"gain","much","strong"};
他們在內(nèi)存的存儲方式分別如右圖所示,可見,系統(tǒng)給數(shù)組a分配了
3×8的空間,而給n分配的空間則取決于具體字符串的長度。
此外,系統(tǒng)分配給a的空間是連續(xù)的,而給n分配的空間則不一定連續(xù)。
由此可見,相比于比二維字符數(shù)組,指針數(shù)組有明顯的優(yōu)點:一是指針數(shù)組中每個元素所指的字符串不必限制在相同的字符長度;二是訪問指針數(shù)組中的一個元素是用指針間接進(jìn)行的,效率比下標(biāo)方式要高。但是二維字符數(shù)組卻可以通過下標(biāo)很方便的修改某一元素的值,而指針數(shù)組卻無法這么做。
舉例編輯
數(shù)組指針:
#includelt;stdio.hgt;
int main()
{
char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一個漢字=3個字節(jié)
char(*p)[4];
int i;p=c;//將指針定位于c[0]
for(i=0;ilt;=5;i++)
{
printf("%s,",*(p+i));//或者將*(p+i)替換成*p++
}
printf("\n");
for(i=5;igt;=0;i--)
{
printf("%s,",*(p+i));//或者將*(p+i)替換成*--p
}
return 0;
}
指針數(shù)組:
#includelt;stdio.hgt;
int main()
{
int i;
char*pch[6]={"妹","妹","你","坐","船","頭"};
for(i=0;ilt;6;i++){
printf("%s,",pchlt;igt;);
}
printf("\n");
for(i=5;igt;=0;i--){
printf("%s\n",pchlt;igt;);
}
return 0;
}
參考資料:
百度百科——指針數(shù)組
#include stdio.h
int main(void)
{
char * test[] = {"1111", "2222", "3333"};
char * p[][3] = {{"1111", "2222", "3333"}};
puts(p[0][0]);
return 0;
}
//注意char * (*p)[] = 。。。 并不是聲明數(shù)組,聲明數(shù)組的方式是char * p[][3] = {{},{},{}...};
//char * (*p)[]只是聲明變量,常用作函數(shù)的聲明中作為形參來使用。