如何理解这行代码int a = 10;int *p1 = &a;int **p = &p1;
时间: 2024-02-23 07:58:20 浏览: 30
这行代码定义了一个整型变量a,其值为10。接着定义了一个指向a的指针变量p1,它的值为a的地址。最后,定义了一个指向指针变量p1的指针变量p,它的值为p1的地址。
我们可以通过p1来访问a的值,例如*p1就表示a的值。而通过p,我们可以访问p1的值,例如*p就表示p1的值,即a的地址。同时,通过**p,我们也可以访问a的值,例如**p就表示a的值。
这样的多级指针在动态内存分配和二维数组等场景下非常有用。例如,我们可以使用双重指针来动态分配一个二维数组,如下所示:
```
int **p;
int n = 3, m = 4;
p = (int **)malloc(sizeof(int*) * n);
for (int i = 0; i < n; i++) {
p[i] = (int *)malloc(sizeof(int) * m);
}
```
这里,我们先分配一个指向指针变量的指针p。然后,我们通过循环分别为每个指针变量分配一个整型数组,从而动态分配了一个n行m列的二维数组。
相关问题
int*p=a和int*p=&b这两个p分别指的什么
假设a和b都是int类型的变量,则:
- int* p = a:这行代码将p指针指向了a变量的地址,也就是说p指向了a变量所在的内存地址,并且可以通过*p来访问a变量的值。
- int* p = &b:这行代码将p指针指向了b变量的地址,也就是说p指向了b变量所在的内存地址,并且可以通过*p来访问b变量的值。
需要注意的是,a和b必须先定义并且分配了内存空间,否则这两行代码会出现错误。例如:
```
int a = 10;
int b = 20;
int* p1 = a; // 错误:a是一个int类型的变量,不是一个指针类型
int* p2 = &b; // 正确:&b是b变量的地址,可以通过指针来访问b变量的值
```
int a=5,*p1,**p2;p1=&a,p2=&p1 此时**p2的值是多少
`**p2` 的值应该是 `a` 的值,也就是 `5`。解释如下:
- `p1` 是一个指向 `a` 的指针,因此 `*p1` 的值是 `a` 的值,也就是 `5`。
- `p2` 是一个指向指针 `p1` 的指针,因此 `*p2` 的值是 `p1` 的值,也就是 `&a`。
- `**p2` 是指针 `p1` 所指向的 `a` 的值,也就是 `5`。