c語言指標的傳引用
阿新 • • 發佈:2021-02-03
c語言指標的傳引用
歡迎關注AWP資訊
當我們想要實現一個如下功能的程式:
在main函式中呼叫另一個遞增函式,實現變數的遞增,我們在初學時或小白狀態時,可能會寫出如下程式碼:
#include <stdio.h>
void add(int a)
{
a = a+1;
}
void main(void)
{
int a = 10;
add(a);
printf("a = %d\n",a);
}
在我們理解的C語言或程式的執行後我們知道,a的值不會隨著add函式遞增變為11,最終打印出的值為10,我們執行看一下結果
打印出來的結果是10,並不是我們期望的11。這裡留給我們思考的就是這裡傳的值跑哪去了,要想理解其中的奧妙,首先要明白雖然在main函式中的變數a和add函式中的a同名,但是這兩個變數的地址是不同的,這裡函式執行時只將值傳進去了,而沒有改變main函式中變數a的值,這兩個變數是不同的變數,分別位於不同的地址空間,所以打印出來的是10。再執行下面一段函式,分別看一下地址和值為多少
#include <stdio.h>
void add(int a)
{
a = a + 1;
printf("add:address a = %d,vaule a = %d\n" ,&a,a);
}
int main()
{
int a = 10;
add(a);
printf("main:address a = %d,vaule a = %d\n",&a,a);
return 0;
}
從列印結果來看add中的地址和main中的地址是不同的,程式執行時只進行了傳值,改變的是不同地址空間上的值,對於main中的變數值仍然沒有改變,可以用如下圖來表示
兩個變數分別在不同的地址上,add函式中的值執行了a+1,a的值變為了11,而main函式中的a沒有執行運算,所以還是保持原來的值。那麼我們如何才能實現不用返回值呼叫add函式的功能,這裡就可以用指標的傳引用來實現,通過指標來傳址,程式碼如下
#include <stdio.h>
void add(int *p)
{
*p =(*p) + 1;//變數地址上的值加1
printf("add:address p = %d,vaule *p = %d\n",p,*p);
}
int main()
{
int a = 10;
add(&a);
printf("main:address a = %d,vaule a = %d\n",&a,a);
return 0;
}
列印結果如下
將變數a的地址傳入add函式,add函式對傳入的地址上的值進行運算操作,使得這一地址上的值改變,最終可以得到我們想要的+1結果。