一级指针存放变量的地址,指向的值是变量的内容。如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