使用指標變數作為函式引數|地址傳遞與指標傳遞例項總結
阿新 • • 發佈:2021-02-11
技術標籤:資料結構與演算法筆記c++演算法指標
使用指標變數作為函式引數|地址傳遞與指標傳遞例項總結
地址傳遞
指標型別可以作為函式引數的型別,這時視為把變數的地址傳入函式。如果在函式中對這個地址的元素進行改變,原先的資料就會確實地被改變。
#include <stdio.h> void change(int *p) { *p = 233; } int main() { int a = 1; int *p = &a; change(p); printf("%d\n", a); return 0; }
輸出結果:
233
分析:將int型的指標變數p賦值為a的地址,通過change函式把指標變數p作為引數傳入,此時傳入的實際上是a的地址。在change函式中,使用p修改地址中存放的資料,實際上修改了a本身。當最後輸出a時,就已經是改變了的值。
值傳遞
#include<stdio.h> void swap(int a, int b) { int temp = a; a = b; b = temp; } int main() { int a = 1, b = 2; swap(a, b); printf("%d %d\n", a, b); return 0; }
輸出結果:
1 2
分析:函式在接收引數時進行的是單向一次性的值傳遞。
在呼叫函式時,只是把引數的值傳進去,相當於產生了一個副本,對這個副本的操作不會影響main函式中a、b的值。只有在獲取地址的情況下對元素進行操作,才能真正地修改變數。
改進程式碼如下:
#include<stdio.h> void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 1, b = 2; int *p1 = &a, *p2 = &b; swap(p1, p2); printf("%d %d\n", a, b); return 0; }
輸出結果為2 1,成功達到修改變數的目的。
錯誤寫法1
#include<stdio.h>
void swap(int *a, int *b) {
int *temp;
*temp = *a;
*a = *b;
*b = *temp;
}
int main() {
int a = 1, b = 2;
int *p1 = &a, *p2 = &b;
swap(p1, p2);
printf("%d %d\n", a, b);
return 0;
}
執行截圖:
錯誤原因:在定義int*型的指標變數temp時,temp沒有初始化,即指標變數temp中存放的地址是隨機的,如果隨機地址指向系統工作區,就會出錯,而指向系統工作區的概率極大。
改進程式碼:
#include<stdio.h>
void swap(int *a, int *b) {
int x;
int *temp = &x;
*temp = *a;
*a = *b;
*b = *temp;
}
int main() {
int a = 1, b = 2;
int *p1 = &a, *p2 = &b;
swap(p1, p2);
printf("%d %d\n", a, b);
return 0;
}
錯誤寫法2
#include<stdio.h>
void swap(int *a, int *b) {
int *temp = a;
a = b;
b = temp;
}
int main() {
int a = 1, b = 2;
int *p1 = &a, *p2 = &b;
swap(p1, p2);
printf("%d %d\n", a, b);
return 0;
}
輸出結果:
1 2
分析:錯誤地認為直接把兩個地址交換,交換後元素也交換了,認為swap函式交換完地址後main函式的a與b地址也被交換。由於函式引數的傳送方式是單向一次性的,main函式傳給swap函式的地址其實是一個無符號整型的數,其本身也與普通變數一樣只是值傳遞,swap函式對地址本身進行修改並不能對main函式裡的地址進行修改,能夠使main函式裡的資料發生變化的只能是swap函式中對地址指向的資料進行的修改,對地址本身進行修改其實與之前對傳入的普通變數進行交換的函式一樣的作用,都只是副本,無法對資料產生實質性的影響。