这个原理和刚才的一样,不在这里赘述了。
二级指针的应用那再讲述了上述的基本概念之后,我们知道二级指针变量是用于存放一级指针变量的地址的,那么在具体的实际应用中,又在什么地方可以用到二级指针呢?下面来看一个 C 语言函数传址调用的例子。
我们在刚学习指针的时候,都会碰到如下这样一个例子:
void swap(int *a,int *b){ int temp; temp = *a; *a = *b; *b = temp;}
之所以在定义函数时,把函数的形参定义为指针,而非如下这样的形式:
void swap(int a,int b);
是因为C 语言在进行函数调用的时候,是将实参的值复制一份,并将其副本传递到函数调用里,如果形参定义的不是指针,那么在函数内部改变数值,不会对实参本来的值发生改变。而将形参定义成了指针的话,那么传到函数里面的值虽然是实参地址的一个副本,但是地址里存的值发生了改变,也就导致实参本来的值也发生了改变。
有了上述分析的基础上,我们知道,如果要在一个函数内改变一个数的值,那么就需要将形参定义为指针。同样的,如果我们要在一个函数内改变一个指针的值,我们就需要将形参定义了二级指针,下面来看这样一个例子:
#include 《stdlib.h》int allocstr(int len,char **retptr){ char *p = malloc(len + 1);/*加 1 是为了 ‘\0’ */ if (p = NULL) return 0; *retptr = p; return 1;}
在调用的时候,是像下面这样子进行调用的:
char *string = “hello world!”char *copystr;if (allostr(strlen(string),©str)) strcpy(copystr,string);else printf(“out of memory!\n”);
上述这个例子就是涉及到字符串拷贝的一个实际的例子,因为我们要在 allostr 里改变指针变量 copystr 的值(要使用 malloc 分配内存),那么就需要把 copystr 的地址传到函数里,那么这个时候,所定义的函数形参也就需要是二级指针了。