今天從函數傳參的角度來理解指針。如果想交換兩個變量a,b的值,我們會這么做:
int temp;
temp = a;
a = b;
b = a;
如果要把以上功能封裝成一個函數,最開始的反應是:
func(int a,int b)
{
int temp;
temp = a;
a = b;
b = a;
}
但是func(a,b);這個函數執行完之后,a和b的值並沒有交換。變換的只是函數內部的臨時變量。以上這種方式無法改為函數外部的變量——a和b。
那么在函數的內部如何改變外部的變量呢,答案是指針。
func(int* a,int* b)
{
int temp;
temp = *a;
*a = *b;
*b = *a;
}
func(&a,&b);
指針就有這個特權,當函數參數是一個一重指針的時候,那么傳入的就應該是變量的地址。
那么在函數的內部就可以直接通過修改該地址中存放的值。這樣就能修改到外部變量的值了。
現在進一步思考,如果函數內部不是修改變量的值,而是指針的值及變量地址的值,又會怎樣呢?沒錯這回就得用到二重指針。
可能有人會問,修改指針的值是想干嘛?修改指針的值的另一種說法就是:將指針指向另一個變量,或者是為指針分配一個新的空間。
比如 int* p = a,如果需要將其封裝成函數,就會造成在函數中修改指針值的情況。假設一個功能函數需要為指針分配一個新的空間:
func(int* a)
{
a = new int();
}
假設函數外部現在有個一個指針int* p,func(p);執行完了之后,指針p仍然沒有分配到新的空間。
道理和第一個例子是一樣的,變的只是函數內部臨時變量指針a的值,p並沒有改變。
要想改變P的值:
func(int** a)
{
(*a) = new int();
}
那么要傳入的參數就是指針的地址值:&p 。func(&p);
這樣函數內部就能修改外部指針的值。
總結:
函數內部修改外部變量的值,需要一重指針;
函數內部修改外部指針變量的值,需要二重指針;