基础
- 二重指针和一重指针本质没有区别(和普通变量也没有区别)
- 二重指针类型(**)只是规定了指向的变量必须是一重指针(编译器检查如果不匹配会报错)
- 二重指针,函数指针,数组指针,结构体指针的出现都是为了方便编译器帮助做静态类型检查
#pragma warning(disable:4996)
#include
#include
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
请按任意键继续. . .
二重指针的作用
- 更改一重指针的指向
#pragma warning(disable:4996)
#include
#include
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;
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;
}
- 确实通过改变指针本身指向
(1p1 = &b)
也可以完成二重指针的作用(*p2 = &b
),但是在函数中就必须要用到二重指针
#pragma warning(disable:4996)
#include
#include
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);
change(p1, &b);
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
#include
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
请按任意键继续. . .
- cuda中的cudaMalloc也是传递的二重指针
参考:
https://www.jianshu.com/p/48f36691c76c