*s表示變量m本身,對*s的賦值就是對m賦值,所以*s=a[p]是正確的。
創(chuàng)新互聯(lián)的客戶來自各行各業(yè),為了共同目標,我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領域包括成都網站建設、成都網站制作、電商網站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。
請注意,函數(shù)fun中的s變量是一個地址,只對該地址進行重新賦值,并不對其所指向的變量m造成影響。所以s=a[p]不改變main函數(shù)中m變量的值。
如果把*s=a[p]改為s=a[p],輸出會是亂碼。這具有很大的迷惑性,使人以為地址的賦值過程出現(xiàn)了問題。實際上,若把m改為全局變量(全局變量中字符串默認為空,int變量默認為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];?????//這里是錯誤的語句
}
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);
}
輸出的將會是the lowest is???who's score is 0
這說明變量m的值并未改變過。
事實上,若非要使用符號,正確的方法是使用“引用”:
#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++中符號的兩個意義。
第一個問題:
形參是指針,實參就應該是對應數(shù)據(jù)類型的地址。
例如:
swap(int *x,int *y)
{
int t ;
t = *x;
*x = *y;
*y = t;
}
int main()
{
int a = 2,b=6;
swap(a,b);
//因為swap函數(shù)的形參是int類型的指針,所以傳入的實參應該是int類型變量的地址
return 0;
}
第二個問題:
當實參是指針的時候,形參應該是什么?
其實很簡單,你只要把
第一問列出來 ①實參:地址 ②形參 :指針
一一對應出來 ①實參:指針 ②形參:指針的指針
因為你要在局部函數(shù)中改變實參,就需要傳遞它的地址,指針也是如此,把它類比為int型變量就好了。
個人理解,希望能幫到你,如有不對,歡迎指正
C語言中,函數(shù)參數(shù)只能傳值。與傳值對應的是傳引用,C語言不支持函數(shù)參數(shù)傳引用,C++語言才支持。
C++傳引用函數(shù):
void foo(int a) { a = 3; }
假如a = 2,執(zhí)行foo(a)后,a = 3。
---
C語言可以模擬傳引用,方法是通過指針來實現(xiàn):
void foo2(int* ap) { *ap = 3; }
假如a = 2,執(zhí)行foo2(a)后,a = 3
foo2(a)調用本質上仍然是傳值,只不過傳遞的是指針,指針即是地址,地址本質上是一個無符號整數(shù)。
如果:
void foo3(int b) { b = 3; }
假如a = 2,執(zhí)行foo3(a)后,a = 2。這是因為foo3(a)調用過程中,a值傳給形參b,修改b的值與實參a無關。
注意到,foo3(a)與上述foo(a)傳引用的調用是形式一樣的。
既然C語言通過指針可以實現(xiàn)傳引用調用,為什么C++還要引入引用這個特性呢?這是因為C++引入的很多新特性需借助引用來實現(xiàn),比如,拷貝構造函數(shù)等等。