一級指針存放變量的地址,指向的值是變量的內容。如int* p={1,2,3}, p=數組的首地址,*p=數組的第一個值; 二級指針存放一級指針的地址,指向一級指針。如int*p ={1,2,3}, int**pp=&p,pp=指針p的首地址,*pp=數組的首地址,**pp=數組第一個值1。 在做爲參數傳遞時何時用一級指針,何時用二級指針?
用二級指針做爲函數參數,有兩種典型狀況: 1.須要傳遞一級指針的數組時: 例如標準C的main函數: int main(int argc, char*[] argv),數組最高維能夠退化,char*[] argv等價於char** argv。這裏argv表明命令行參數數組。 2.須要對傳入的一級指針進行修改時: 例如: void alloc_new_char_array(int n, char** t) { *t = (char*)malloc(n * sizeof(t)); } 這裏能夠經過返回值達到相同的效果,不過須要同時修改多個指針的時候就不能用返回值了。另外,C++中能夠用引用代替,本質上和這裏的修改指針的方法相同。 ---- 相似地,一級指針做爲參數則用來傳遞非指針數組,以及對非指針對象進行修改。
指針數組的數組名傳遞參數對應爲指針的指針即二級指針,二維數組的數組名傳遞參數對應爲數組指針即指向一維數組的指針數組
一級指針經過形參,能夠修改實參中指針所指向的地址中的值。修改不了實參中指針所指向的地址。須要藉助二級指針才能夠。ide
二級指針調用,傳遞的是一級指針的地址。函數
void f(int **); int main(void) { int *num, a = 1; num = &a; f(&num); return 0; }
#include <stdio.h> void swap(int *, int *);//交換值 int main(void) { int a = 1, b = 2, c= 3; printf("變量a的地址是:%p\n", &a); printf("變量b的地址是:%p\n", &b); swap(&a, &b); printf("變量a = %d,地址:%p\n", a, &a);//驗證在被調用函數後,a的指向 printf("變量b = %d, 地址:%p\n", b, &b); return 0; } void swap(int *a, int *b) { int t; int num = 10; int *c = # printf("%p\n", a); //指針a所指內容的初始地址,即a的值 a = c; //改變a的指向,使其和C指向同一個地址 printf("%p\n",a); //驗證交換事後a指向的地址 t = *a; *a = *b; *b = t; }
參考網址:
http://blog.csdn.net/bearray123/article/details/7209356
http://www.csdn.net/article/2013-01-10/2813559-two-star-programming