C语言 二重指针

基础

  1. 二重指针和一重指针本质没有区别(和普通变量也没有区别)
  2. 二重指针类型(**)只是规定了指向的变量必须是一重指针(编译器检查如果不匹配会报错)
  3. 二重指针,函数指针,数组指针,结构体指针的出现都是为了方便编译器帮助做静态类型检查
#pragma warning(disable:4996)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int a = 1;
	int *p1 = &a;
	int **p2 = &p1;
	printf("a的地址%x,a的值%d\n", &a,a);
	printf("p1的地址%x,p1的值%x\n", &p1, p1);
	printf("p2的地址%x,p2的值%x\n", &p2, p2);
	system("pause");
	return 0;
}



a的地址f6f9b4,a的值1
p1的地址f6f99c,p1的值f6f9b4
p2的地址f6f990,p2的值f6f99c
请按任意键继续. . .

在这里插入图片描述

二重指针的作用

  1. 更改一重指针的指向
#pragma warning(disable:4996)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int a = 1;
	int b = 2;
	int *p1 = &a;
	int **p2 = &p1;

	printf("a的地址%x,a的值%d\n", &a,a);
	printf("b的地址%x,b的值%d\n", &b,b);
	printf("p1的地址%x,p1的值%x\n", &p1, p1);
	printf("p2的地址%x,p2的值%x\n", &p2, p2);

	
	*p2 = &b;// 等价于p1 = &b;

	printf("a的地址%x,a的值%d\n", &a, a);
	printf("b的地址%x,b的值%d\n", &b, b);
	printf("p1的地址%x,p1的值%x\n", &p1, p1);
	printf("p2的地址%x,p2的值%x\n", &p2, p2);

	system("pause");
	return 0;
}
  1. 确实通过改变指针本身指向(1p1 = &b)也可以完成二重指针的作用(*p2 = &b),但是在函数中就必须要用到二重指针
#pragma warning(disable:4996)

#include <stdio.h>
#include <stdlib.h>

void change(int *p, int *b)
{//函数change创建了p的新的副本,函数结束后销毁,所以并没有改变函数外原指针的指向
	p = &b;
}
int main()
{
	int a = 1;
	int b = 2;
	int *p1 = &a;

	printf("a的地址%x,a的值%d\n", &a, a);
	printf("b的地址%x,b的值%d\n", &b, b);
	printf("p1的地址%x,p1的值%x\n", &p1, p1);

	change(p1, &b); //p1指针并没有改变

	printf("p1的地址%x,p1的值%x\n", &p1, p1);
	system("pause");
	return 0;
}



a的地址8ffb6c,a的值1
b的地址8ffb60,b的值2
p1的地址8ffb54,p1的值8ffb6c
p1的地址8ffb54,p1的值8ffb6c
请按任意键继续. . .
#pragma warning(disable:4996)

#include <stdio.h>
#include <stdlib.h>

void change(int *p, int *b)
{
	*p = b;
}
int main()
{
	int a = 1;
	int b = 2;
	int *p1 = &a;


	printf("a的地址%x,a的值%d\n", &a, a);
	printf("b的地址%x,b的值%d\n", &b, b);
	printf("p1的地址%x,p1的值%x\n", &p1, p1);

	int **p2 = &p1;//创建二级指针,二级指针的值是一级指针的地址,进入函数后,会创建二级指针副本(二级指针本身地址发生变化,但是他的值,既一级指针的地址不会发生变化)
	change(p2, &b);

	printf("p1的地址%x,p1的值%x\n", &p1, p1);
	system("pause");
	return 0;
}


a的地址fefddc,a的值1
b的地址fefdd0,b的值2
p1的地址fefdc4,p1的值fefddc
p1的地址fefdc4,p1的值fefdd0
请按任意键继续. . .
  1. cuda中的cudaMalloc也是传递的二重指针
    参考:
    https://www.jianshu.com/p/48f36691c76c
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值