指針變量作為函數(shù)參數(shù)詳解,形參和實(shí)參之間的值傳遞如何傳遞?如何改變指針變量所指向的變量?
函數(shù)的參數(shù)不僅可以是整型,浮點(diǎn)型,字符型等數(shù)據(jù),還可以是指針類型;它的作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中。
關(guān)于地址,指針,指針變量可以參考一下這篇文章:
C語言指針操作(一)地址,指針,指針變量是什么
目錄
一、引入
1.1改變指針變量的值
1.2改變指針變量所指向的值
二、程序練習(xí)
2.1程序?qū)崿F(xiàn)
2.2程序分析
一、引入
我們先來看一個(gè)問題:輸入整數(shù) a 和 b,按大小先后順序輸出 a 和 b。
可以使用多種方法來處理這個(gè)這個(gè)問題
1.1改變指針變量的值
#include<stdio.h>
int main()
{
int* p1, * p2, * p, a, b; //定義指向整型的指針變量和整型變量
printf("請輸入兩個(gè)整數(shù):");
scanf_s("%d,%d", &a, &b);
p1 = &a; //賦予a的地址,指向變量a
p2 = &b; //賦予b的地址,指向變量b
if (a < b) //如果a<b,交換p1和p2
{
p = p1;
p1 = p2;
p2 = p;
}
printf("a=%d, b=%d\n", a, b); //輸出a, b的值
printf("max = %d, min = %d\n", *p1, *p2); //輸出指針變量p1和p2所指向的變量值
return 0;
}
判斷語句中也可以改為直接對 p1 和 p2 賦予新值,不用中間變量 p,使程序更加簡練。
{
p1 = &b;
p2 = &a;
}
運(yùn)行結(jié)果:
程序分析:
由圖可知,指針變量 p1 和 p2 的值發(fā)生了交換,而變量 a,b的值未發(fā)生交換。
這種算法是不交換原來變量的值,而是交換指針變量的值。
1.2改變指針變量所指向的值
用指針變量作為函數(shù)參數(shù)
#include<stdio.h>
int main()
{
void swap(int* p1, int* p2);
int* point_1, * point_2, a, b; //定義指向整型的指針變量和整型變量
printf("請輸入兩個(gè)整數(shù):");
scanf_s("%d,%d", &a, &b);
point_1 = &a; //賦予a的地址
point_2 = &b; //賦予b的地址
if (a < b) //如果a<b,調(diào)用swap函數(shù)
{
swap(point_1, point_2);
}
printf("a=%d, b=%d\n", a, b); //輸出a, b的值
printf("max = %d, min = %d\n", *point_1, *point_2); //輸出兩個(gè)指針變量的值所指向的變量值
return 0;
}
void swap(int* p1, int* p2) //自定義函數(shù),交換指針變量p1和p2
{
int* temp;
temp = p1;
p1 = p2;
p2 = temp;
}
運(yùn)行結(jié)果:
程序分析:
由運(yùn)行結(jié)果我們可以看出:變量 a 和 b 未發(fā)生交換,指針變量 point_1 和 point_2 的值也沒有發(fā)生交換,那么函數(shù) swap 到底實(shí)現(xiàn)交換功能了嗎?我們將swap函數(shù)添加一個(gè)輸出語句看一下結(jié)果。
void swap(int* p1, int* p2) //自定義函數(shù),交換指針變量p1和p2
{
int* temp;
temp = p1;
p1 = p2;
p2 = temp;
printf("*p1 = %d, *p2 = %d\n", *p1, *p2);
}
可知在swap函數(shù)中,*p1 = 8,*p2 = 5;實(shí)現(xiàn)了交換的功能,但沒有將改變的值傳回去。
結(jié)合函數(shù)調(diào)用的知識,我們可以知道調(diào)用函數(shù)時(shí),采取的是單向值傳遞,形參的改變不能使實(shí)參也隨之改變。
由圖可知,指針變量 point_1 和 point_2 的值沒有發(fā)生交換,那么他們指向的變量也沒有發(fā)生變化。
如果在函數(shù)中我們能使指針變量所指向的變量發(fā)生變化,那么就可以達(dá)到交換原變量的目的,此時(shí)而指針變量本身的值(即地址)不發(fā)生變換
我們對 swap 函數(shù)稍作修改,使它訪問到指針變量所指向的變量。
void swap(int* p1, int* p2) //自定義函數(shù),交換指針變量所指向的變量*p1和*p2
{
int temp;
temp = *p1; //交換*p1和*p2
*p1 = *p2;
*p2 = temp;
}
運(yùn)行結(jié)果:
程序分析:
從結(jié)果我們可以看出,變量 a 和 b 發(fā)生了交換,也就是指針變量 point_1 和 point_2 指向的變量發(fā)生了交換。
由圖可知,指針變量 point_1 和 point_2 的值(即地址 &a,&b)未發(fā)生變化,指針變量所指的變量(即變量 a,b)發(fā)生了變化。
這種算法是交換原來變量的值,而不交換指針變量的值。
這里需要注意的是中間變量 temp 的定義形式:
void swap(int* p1, int* p2) //自定義函數(shù),交換指針變量所指向的變量*p1和*p2
{
int* temp; //指針變量temp
*temp = *p1; //交換*p1和*p2
*p1 = *p2;
*p2 = *temp;
}
這時(shí)程序雖然語法上沒有報(bào)錯(cuò),但編譯時(shí)會報(bào)錯(cuò),*p1 就是 a,是整型變量,而 *temp 是指針變量 temp 所指向的變量,由于未給 temp 賦值,因此temp的值是無法確定的,所以temp所指向的存儲單元也是未知的,因而 *temp = *p1 就是向一個(gè)未知的存儲單元賦值,這是不合法的。
總結(jié):
函數(shù)的調(diào)用只可以得到一個(gè)返回值,而使用指針變量作為參數(shù),可以得到多個(gè)變化了的值。
二、程序練習(xí)
輸入3個(gè)整數(shù) a,b,c,要求按大小順序?qū)⑺麄冚敵?,用函?shù)實(shí)現(xiàn)。
2.1程序?qū)崿F(xiàn)
#include<stdio.h>
int main()
{
void exchange(int* q1, int* q2, int* q3); //聲明函數(shù),后面需要調(diào)用
int a, b, c, * point_1, * point_2, * point_3;
printf("請輸入三個(gè)整數(shù):");
scanf_s("%d,%d,%d", &a, &b, &c);
point_1 = &a; point_2 = &b; point_3 = &c;
exchange(point_1, point_2, point_3);
printf("Max = %d, Mid = %d, Min = %d\n", a, b, c);
return 0;
}
void exchange(int* q1, int* q2, int* q3) //自定義函數(shù),交換3個(gè)變量的值
{
void swap(int* p1, int* p2); //聲明函數(shù),后面需要調(diào)用
if (*q1 < *q2) { swap(q1, q2); }
if (*q1 < *q3) { swap(q1, q3); }
if (*q2 < *q3) { swap(q2, q3); }
}
void swap(int* p1, int* p2) //自定義函數(shù),交換指針變量所指向的變量*p1和*p2
{
int temp;
temp = *p1; //交換*p1和*p2
*p1 = *p2;
*p2 = temp;
}
2.2程序分析
exchange 函數(shù)的作用是對3個(gè)數(shù)按大小排序,在執(zhí)行 exchange 函數(shù)過程中,要嵌套調(diào)用 swap 函數(shù),swap 函數(shù)的作用是對兩個(gè)數(shù)按大小排序,通過調(diào)用 swap 函數(shù)(最多調(diào)用3次)實(shí)現(xiàn)3個(gè)數(shù)的排序。
主函數(shù)中3個(gè)指針變量的值未發(fā)生改變,3個(gè)指針變量所指向的變量的值發(fā)生了改變。
要熟練掌握指針變量和指針變量所指向變量之間的關(guān)系,避免混淆!
C語言指針操作系列文章:
C語言指針操作(一)地址,指針,指針變量是什么
C語言指針操作(二)指針變量作為函數(shù)參數(shù)
C語言指針操作(三)通過指針引用數(shù)組
C語言指針操作(四)用數(shù)組名作函數(shù)參數(shù)
C語言指針操作(五)通過指針引用多維數(shù)組
C語言指針操作(六)通過指針引用字符串
C語言指針操作(七)指向函數(shù)的指針
C語言指針操作(八)返回指針值的函數(shù)
C語言指針操作(九)指針數(shù)組和多重指針
C語言指針操作(十)動態(tài)內(nèi)存分配與指向它的指針變量文章來源:http://www.zghlxwxcb.cn/news/detail-759413.html
C語言指針操作(十一)有關(guān)指針的小結(jié)文章來源地址http://www.zghlxwxcb.cn/news/detail-759413.html
到了這里,關(guān)于C語言指針操作(二)指針變量作為函數(shù)參數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!