本篇內(nèi)容:指針星號(hào)的三種含義以及指針在函數(shù)調(diào)用時(shí),與實(shí)參、形參的變量傳遞關(guān)系,如何通過被調(diào)函數(shù)修改主調(diào)函數(shù)普通變量的值。
傳送門:
C語言指針入門學(xué)習(xí)、概念梳理(一)
C語言指針入門學(xué)習(xí)、概念梳理(二)
C語言指針入門學(xué)習(xí)、知識(shí)點(diǎn)梳理(三)
C語言指針入門學(xué)習(xí)、知識(shí)點(diǎn)梳理(四)
1. 星號(hào)*的含義:
- 乘法
- 定義指針變量:int * p; //定義了一個(gè)名叫p的指針變量,int *表示p只能存放int整型變量的地址
- 指針運(yùn)算符:放在已經(jīng)定義好的指針變量的前面,如果p是一個(gè)已定義好的指針變量,則p表示以p的內(nèi)容為地址的變量
int * p;中的星號(hào)與P = 5中的星號(hào)不是同一個(gè),前者表示p是一個(gè)指針變量,后者表示取值運(yùn)算符,*p等同于5
C語言變量中的約定俗成:整型用ijkl 浮點(diǎn)型用xyz 指針用pqst
# include <stdio.h>
int main(void)
{
int * p; //該語句等價(jià)于 int *p; 也等價(jià)于int* p; 一般來說寫法寫int * p;
int i = 5;
char ch = 'A'; //單個(gè)字符必須用單括號(hào),否則會(huì)被系統(tǒng)認(rèn)成變量
p = &i; //正確,*p是以p的內(nèi)容為地址的變量
*p = 99; //p接收了i的地址,所以*p就等同于i,即i的值為被賦值99
printf("i = %d, *p = %d\n", i, *p);
//p = &ch; //error 類型不一致
//p = ch; //error 類型不一致
//p = 5; //error
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
運(yùn)行結(jié)果: i = 99, *p = 99;
通過以上程序,可以清楚了解地址及指針的作用,注意區(qū)分 p 、 *p、 &i 、int * p;這些是了解指針、學(xué)習(xí)指針、運(yùn)用指針的基礎(chǔ)知識(shí),務(wù)必熟記于胸。
# include <stdio.h>
void swap_1(int a, int b); //函數(shù)聲明,此處還可以寫成: void swap_1(int , int )
void swap_2(int * p, int * q) //形參名字不是*p,*q而是p,q,接收實(shí)參數(shù)據(jù), 函數(shù)結(jié)束后釋放p,q,所以光調(diào)換p,q值不影響主函數(shù)中的a,b
{ //C語言是值傳遞,此時(shí)p存放a的地址(如1000H),p也有自己的地址(如2000H),
int * t; //*p表示的是a地址中的數(shù)據(jù)(3),修改*p就會(huì)修改變量a的值。
t = p; p = q; q = t; //此處換的是p,q的地址,而沒有換*p,*q,即主函數(shù)中a,b的地址和值都不變,所以輸出結(jié)果還是a = 3, b = 5
}
void swap_3(int * p, int * q) //形參名字不是*p,*q而是指針變量p,q,接收實(shí)參數(shù)據(jù)(地址數(shù)據(jù))
{ //C語言是值傳遞,此時(shí)p存放a的地址(如1000H),p也有自己的地址(如2000H),
int t; //*p,*q等同于a,b為int型,所以為保持類型一致,t也必須是整型int
t = *p; *p = *q; *q = t; //*p,*q雖然在子函數(shù)中,但通過地址可以直接修改主函數(shù)中a,b的值,輸出結(jié)果為a = 5, b = 3
}
int main(void)
{
int a = 3;
int b = 5;
//swap_1(a, b); //不報(bào)錯(cuò),但無法修改主函數(shù)中a,b的值,不能完成交換
//swap_2(a, b) //error:錯(cuò)誤,形參是指針變量p和q,p要接收的是整型地址而不是整型變量,應(yīng)改為swap_2(&a, &b);
//swap_2(&a, &b); //不報(bào)錯(cuò),把a(bǔ)的地址傳遞給p,把b的地址傳遞給q。但是函數(shù)結(jié)束后主函數(shù)中a,b仍未完成交換
swap_3(&a, &b); //雖然調(diào)用函數(shù)結(jié)束后,形參指針變量p,q的值會(huì)被釋放,但通過指針*p,*q,主函數(shù)中a,b的值已經(jīng)被改寫了,交換成功
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap_1(int i, int j) //返回值為void,可以直接寫return; 也可以不寫return,每調(diào)用一次return只能返回一個(gè)值
{
int t;
t = i; i = j; j = t; //等號(hào)兩邊類型一致,不報(bào)錯(cuò),但修改形參的值不影響主函數(shù)變量,無法完成交換
//return; //return有返回值,終值函數(shù)的作用
}
------------------------------------------------------------------------------------------------------------------------
三個(gè)函數(shù)中,只有swap_3()才能完成交換,輸出: a = 5, b = 3
其余兩個(gè)函數(shù),輸出結(jié)果都是: a = 3, b = 5
總結(jié)一句話就是: 熟練掌握形參、實(shí)參、指針變量、地址、星號(hào)的概念,只有這樣才不容易被程序中各種變量繞暈。
1.形參互換,調(diào)用函數(shù)結(jié)束后形參p,q被釋放,所以沒法兒影響main主函數(shù)中的實(shí)參a,b,無法完成交換
2.但是由于的特性,形參p,q通過拷貝實(shí)參a,b的地址,可以利用*p,*q遠(yuǎn)程修改主函數(shù)中a,b的值,完成交換。
3.形參和實(shí)參永遠(yuǎn)不同,他們在不同的函數(shù)中,分配的空間也不同,屬于不同的變量,主函數(shù)傳遞給調(diào)用函數(shù)的值相當(dāng)于是拷貝過去的,并不影響主函數(shù)中的實(shí)參,只有調(diào)用函數(shù)有了主函數(shù)變量的地址時(shí),才可以直接控制修改實(shí)參變量,而指針可以通過地址在調(diào)用函數(shù)中遠(yuǎn)程修改主函數(shù)中的變量值。
歸納:如何通過被調(diào)函數(shù)修改主調(diào)函數(shù)普通變量的值?文章來源:http://www.zghlxwxcb.cn/news/detail-491059.html
- 實(shí)參必須為該普通變量的地址,如: 函數(shù)名(&a,&b)
- 形參必須為指針變量,如 int * p, int *q
- 在被調(diào)函數(shù)中通過 *形參名 = … 的方式就可以修改主調(diào)函數(shù)一個(gè)以上的相關(guān)變量的值
(能力有限,博客僅供廣大網(wǎng)友參考學(xué)習(xí),若有不足之處,還望指正,共同進(jìn)步!)文章來源地址http://www.zghlxwxcb.cn/news/detail-491059.html
到了這里,關(guān)于C語言指針入門學(xué)習(xí)、知識(shí)點(diǎn)梳理(四)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!