在提供的代码中,存在一些问题,这些问题会导致编译错误或者运行时错误。让我们一步步分析并修复这些问题。
1. 变量 `p` 是一个指向指针的指针,但是它没有被初始化。在尝试通过 `p` 访问数组 `a` 的元素之前,我们需要将 `p` 初始化为指向 `a` 的指针。
2. 在 `for` 循环中,`*(*(p+i))` 的使用是不正确的。因为 `p` 没有被初始化为指向 `a` 的正确地址,所以这里访问的是未定义的内存。
3. 在 `for` 循环中,`*(p+i)=a[i];` 这行代码尝试将 `a[i]` 的地址赋值给 `p` 指向的数组,但是这不是我们想要的行为。我们应该是直接打印 `a[i]` 指向的值和地址。
下面是修正后的代码:
```c
#include
int main() {
int *p, *a[3];
int x = 11, y = 22, z = 33;
a[0] = &x;
a[1] = &y;
a[2] = &z;
int i;
// 初始化p为指向a的指针
p = a;
for (i = 0; i < 3; i++) {
// 直接打印a[i]指向的值和地址
printf("%d\t%p\n", *a[i], (void *)a[i]);
}
}
```
在这个修正后的代码中,我们初始化了 `p` 为指向 `a` 的指针,然后在 `for` 循环中直接使用 `a[i]` 来访问和打印值和地址。注意,我们在打印地址时使用了 `(void *)` 来避免编译器警告,因为 `printf` 的 `%p` 格式说明符期望一个 `void *` 类型的参数。