很簡(jiǎn)單.
寶清ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
首先,我們定義一個(gè)指針是
類(lèi)型
*
變量名,比如int
*pInt
=
NULL;
我們定義結(jié)構(gòu)體指針也是一樣的,
結(jié)構(gòu)體名
*pStruct(C語(yǔ)言:struct
結(jié)構(gòu)體名
*pStruct,
C++:結(jié)構(gòu)體名
*pStruct,
struct一般可以省略),
比如:
#include
#include
struct
stStudent
{
char
szName[10];
int
nID;
};
void
Print(stStudent
*pStd)
{
printf("Name:%s\n",
pStd-szName);
printf("ID:%d\n",
pStd-nID);
}
void
InitStudent(stStudent
*pStd)
{
strcpy(pStd-szName,
"CIW");
pStd-nID
=
14;
}
int
main()
{
stStudent
stStd;
InitStudent(stStd);
Print(stStd);
return
0;
}
C語(yǔ)言請(qǐng)加struct.
newlist()函數(shù)有問(wèn)題:
1、返回類(lèi)型應(yīng)該為struct LIST*;
2、返回值不能為函數(shù)的局部變量!因?yàn)楹瘮?shù)里的局部變量是不保存的,隨函數(shù)調(diào)用結(jié)束而消失~
改成如下形式,試試看:
struct LIST * newlist ()
{
struct LIST *plist1 ;
plist1=malloc(sizeof(struct LIST));
plist1-last=0;
return plist1;
}
struct LNode{
int data;
struct LNode *next;
}*LinkList; //結(jié)構(gòu)體。
修改為
typedef struct LNode{
int data;
struct LNode *next;
}*LinkList; //結(jié)構(gòu)體。
雙指針
C語(yǔ)言結(jié)構(gòu)體傳參
?
小-黯
原創(chuàng)
關(guān)注
7點(diǎn)贊·2315人閱讀
目錄
C語(yǔ)言結(jié)構(gòu)體傳參
1. 普通傳參
1.1 測(cè)試代碼
1.2 測(cè)試結(jié)果
1.3 結(jié)果分析
2. 單指針傳參
2.1 修改結(jié)構(gòu)體數(shù)據(jù)
2.1.1 測(cè)試代碼
2.1.2 測(cè)試結(jié)果
2.1.3 結(jié)果分析
2.2 修改結(jié)構(gòu)體地址
2.2.1 測(cè)試代碼
2.2.2 測(cè)試結(jié)果
2.2.3 結(jié)果分析
3. 雙指針傳參
3.1 測(cè)試代碼
3.2 測(cè)試結(jié)果
3.2 結(jié)果分析
C語(yǔ)言結(jié)構(gòu)體傳參
結(jié)構(gòu)體傳參包括三種傳參方式
普通傳參:函數(shù)接收到結(jié)構(gòu)體參數(shù)后,會(huì)復(fù)制一份原來(lái)的結(jié)構(gòu)體作為形參供函數(shù)使用,而函數(shù)內(nèi)的任何操作都是對(duì)拷貝結(jié)構(gòu)體的修改,不會(huì)影響到原本的結(jié)構(gòu)體變化。
單指針傳參:函數(shù)接收的是一個(gè)結(jié)構(gòu)體的地址,該指針指向的是結(jié)構(gòu)體起始地址,也就相當(dāng)于傳入了結(jié)構(gòu)體內(nèi)所有變量的地址,函數(shù)接收到該結(jié)構(gòu)體指針后,我們就可以根據(jù)地址訪問(wèn)結(jié)構(gòu)體中每個(gè)變量的真實(shí)數(shù)據(jù),在函數(shù)內(nèi)對(duì)結(jié)構(gòu)體內(nèi)數(shù)據(jù)的操作,都會(huì)影響到原本結(jié)構(gòu)體內(nèi)數(shù)據(jù)的變化
雙指針傳參:函數(shù)接收的是結(jié)構(gòu)體指針變量的地址,因?yàn)橐患?jí)指針代表的是結(jié)構(gòu)體的地址,在函數(shù)中能夠操作結(jié)構(gòu)體內(nèi)的數(shù)據(jù),則二級(jí)指針指向的是結(jié)構(gòu)體的地址,則同理我們可以根據(jù)二級(jí)指針訪問(wèn)修改結(jié)構(gòu)體的地址
即通過(guò)一級(jí)指針,對(duì)結(jié)構(gòu)體內(nèi)數(shù)據(jù)的操作會(huì)影響到原本結(jié)構(gòu)體內(nèi)數(shù)據(jù)的變化
而通過(guò)二級(jí)指針,對(duì)結(jié)構(gòu)體地址的操作會(huì)影響到原本結(jié)構(gòu)體地址的變化,例如為結(jié)構(gòu)體分配空間
tail是一個(gè)指針,它指向的內(nèi)容會(huì)因函數(shù)內(nèi)的變化而發(fā)生變化,但它本身不會(huì)因函數(shù)的變化而發(fā)生變化。
*s表示變量m本身,對(duì)*s的賦值就是對(duì)m賦值,所以*s=a[p]是正確的。
請(qǐng)注意,函數(shù)fun中的s變量是一個(gè)地址,只對(duì)該地址進(jìn)行重新賦值,并不對(duì)其所指向的變量m造成影響。所以s=a[p]不改變main函數(shù)中m變量的值。
如果把*s=a[p]改為s=a[p],輸出會(huì)是亂碼。這具有很大的迷惑性,使人以為地址的賦值過(guò)程出現(xiàn)了問(wèn)題。實(shí)際上,若把m改為全局變量(全局變量中字符串默認(rèn)為空,int變量默認(rèn)為0):
#includestdio.h
#includestring.h
#define?N?10
typedef?struct?ss
{
char?num[10];
int?s;
}STU;
void?fun(STU?a[],STU?*s)
{
int?t,p=0;
t=a[0].s;
for(int?i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];?????//這里是錯(cuò)誤的語(yǔ)句
}
STU?m;
void?main()
{
STU?a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
};
printf("the?original?data?is?:\n");
for(int?i=0;iN;i++)
{
printf("NO=%s?MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the?lowest?is?%s??who's?score?is?%d\n",m.num,m.s);
}
輸出的將會(huì)是the lowest is???who's score is 0
這說(shuō)明變量m的值并未改變過(guò)。
事實(shí)上,若非要使用符號(hào),正確的方法是使用“引用”:
#includestdio.h
#includestring.h
#define?N?10
typedef?struct?ss
{
char?num[10];
int?s;
}STU;
void?fun(STU?a[],STU?s)
{
int?t,p=0;
t=a[0].s;
for(int?i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];
}
void?main()
{
STU?a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
},m;
printf("the?original?data?is?:\n");
for(int?i=0;iN;i++)
{
printf("NO=%s?MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the?lowest?is?%s??who's?score?is?%d\n",m.num,m.s);
}
這里的意思是“引用”,你可以百度上搜索C++中符號(hào)的兩個(gè)意義。