二重指针


二重指针就是指向指针的指针。

其声明原型为:

datatype ** variable_name;

假设我们声明并定义了三个变量:

int a = 1; /*整数类型变量*/
int *b;     /*整数类型指针*/
b = &a;    /*赋值,指向a*/
int **c;   /*二重指针*/
c = &b;    /*指向b*/

打印a,b,c的值:

a=1,b=002CF784,c=002CF778请按任意键继续. . .

首先声明并定义了整数类型变量a,其值为1。然后定义了指针变量b,并指向a,因此b的值为变量a的地址。同理,c的值为指针变量b的地址。因此,有了二重指针变量,我们可以分别获得b 和 a 的值。 *c为b的值(该值为a的地址),**c为a的值(1)。


用图阐释一下:



假设整形变量a的值为1,a在内存中的地址为0x1000,指针变量b指向a,因此b的值为0x1000,同时由图知道b的地址为0x1003,二重指针变量c指向b,因此c的值为0x1003,同时知道c的地址为1006。


指针的一个用途:在函数中改变变量的内容。


比如我们想要改变整数变量类型a的值。我们就可以用到指针变量。

                             归零函数

void resetTo0(int* number)
{
	*number = 0;
}
int main()
{
	int a = 10;
	resetTo0(&a);
	printf("%d",a);
}

如果函数参数类型不用指针,并且调用函数中没有用到引用(&),则该函数根本不起任何作用。


上面传递的参数是原始类型,比如int,double,float等,如果传递的是指针类型,比如是一个链表(通常是一个头指针),如果只是遍历,直接传入函数遍历即可,加入我们想要对链表进行插入或者删除等操作,那就必须用到二重指针了(**)

举个简单的例子:

改变指针变量的值。

#include 
#include 

void changeValue(int ** value)
{
	*value = (int*)malloc(sizeof(int));
}

int main()
{
	int * my_value = (int*)malloc(sizeof(int));	/*动态申请内存*/
	printf("%d \n",my_value);	/*打印分配好的内存位置*/
	changeValue(&my_value);
	printf("%d",my_value);
}

1971312
1971360请按任意键继续. . .



Over...


你可能感兴趣的:(二重指针)