『壹』 關於c語言結構體指針做函數形參的問題
*s表示變數m本身,對*s的賦值就是對m賦值,所以*s=a[p]是正確的。
請注意,函數fun中的s變數是一個地址,只對該地址進行重新賦值,並不對其所指向的變數m造成影響。所以s=&a[p]不改變main函數中m變數的值。
如果把*s=a[p]改為s=&a[p],輸出會是亂碼。這具有很大的迷惑性,使人以為地址的賦值過程出現了問題。實際上,若把m改為全局變數(全局變數中字元串默認為空,int變數默認為0):
#include<stdio.h>
#include<string.h>
#defineN10
typedefstructss
{
charnum[10];
ints;
}STU;
voidfun(STUa[],STU*s)
{
intt,p=0;
t=a[0].s;
for(inti=1;i<N;i++)
{
if(t>a[i].s)
{
t=a[i].s;
p=i;
}
}
s=&a[p];//這里是錯誤的語句
}
STUm;
voidmain()
{
STUa[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
};
printf("theoriginaldatais: ");
for(inti=0;i<N;i++)
{
printf("NO=%sMARK=%d ",a[i].num,a[i].s);
}
fun(a,&m);
printf("thelowestis%swho'sscoreis%d ",m.num,m.s);
}
輸出的將會是the lowest iswho's score is 0
這說明變數m的值並未改變過。
事實上,若非要使用&符號,正確的方法是使用「引用」:
#include<stdio.h>
#include<string.h>
#defineN10
typedefstructss
{
charnum[10];
ints;
}STU;
voidfun(STUa[],STU&s)
{
intt,p=0;
t=a[0].s;
for(inti=1;i<N;i++)
{
if(t>a[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];
}
voidmain()
{
STUa[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
},m;
printf("theoriginaldatais: ");
for(inti=0;i<N;i++)
{
printf("NO=%sMARK=%d ",a[i].num,a[i].s);
}
fun(a,m);
printf("thelowestis%swho'sscoreis%d ",m.num,m.s);
}
這里&的意思是「引用」,你可以網路上搜索C++中&符號的兩個意義。
『貳』 關於C語言結構體指針做函數形參的問題
fun函數的第二個參數之所以用指針,就是為了能把函數裡面對這個參數做的改動保存下來
而你如果把*s=a[p];改成s=&a[p];效果相當於,改了s的值,使其不再指向參數(函數
外部變數
m)的地址,雖然*s的值是正確的,但實際m的值則沒有改變,所以在外面輸出的時候,結果和預期不一致了
s=&a[p];這個操作本身沒有問題
『叄』 C語言用指針作函數參數
選D
因為第一個
參數
是地址傳遞,fun(&b,a);中傳入a
字元
。*c=*c+1將c的值變為b字元。
主函數
的值改變。
第二個參數是值傳遞,所以在
函數
中d的值為B字元。但是並不影響主函數的值,所以主函數輸出a的值是A。b的值是b。
『肆』 指針做函數的形參求幫助C語言
如果想把在子函數中的數據操作變化反應到主函數中的相應變數上,則在主函數中一定要傳遞這個變數的地址,不要管這個變數是什麼類型!!
struct BiTree*a; //這里定義一個變數a , 它的類型是個結構體指針
creatBiTree(&a); //這里是將a的地址傳遞到子函數中,這樣,子函數中,通過對a變數的地址的操作,實現了a本身的值的變化!!
void creatBiTree(struct BiTree**root) //這里形參是**,是因為a是指針,a的地址還是個指針,因此要是二維指針類型,這是與a的類型相關的!
如果改成(struct BiTree *root) , 主函數中 creatBiTree(&a); //寫成這樣編譯會報參數類型錯誤, creatBiTree(a); //則root在子函數中的變化,不能反應到a上!!root和a僅是在數值上相等的兩個不同的數據!
『伍』 關於c語言 指針變數作為函數形參的問題
這里是指針變數,但是它指向的空間是被分配過的.你可以向裡面寫入或者讀出.
『陸』 在c語言中,指針作為函數參數,形參只能傳遞值,而不能傳遞地址,是怎麼回事
建議上代碼
問題中說法本來就是錯的
形參指的是你聲明或者定義用的那個參數,本來也不是傳值的
至於傳值還是傳地址,如果形參是指針p,那麼傳遞過去的p值就是地址,同時也是自身的值,這個看具體使用情況
所以一句話,show me your code
『柒』 c語言中指針作為形參,代碼如下:
你要用*去解引用,這樣才能改變指針指向內存的值。
你的swap函數寫的有問題,正確的寫法有人給了。
至於為什麼*x,*y的值沒有改變,因為你交換的是2個形參的值,雖然你傳入的是指針,但是你沒有把它們當成指針來用,最後的結果跟傳非指針值是一樣的。
如果想真正改變實參的值,就必須交換指針指向的內存,而不是單純交換指針變數本身。形參是通過堆棧傳遞的,只有用類似 *x = 1;這樣的語句操作指針指向的內存,才能影響到實參,否則實參的值是不會改變的。
其實最好的方式就是去VS里調試運行,仔細觀察運行過程,就能比較清晰地了解指針。單純的理論是站不住腳的,拉出來溜溜就一清二楚了。
想對你能有幫助。