c语言指针与数组问题。在以下程序中为何二级指针的初始化赋值有错,求大虾相助!

#include <stdio.h>

int main() {
int a[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int **p = &a;
while (*p) {
while (**p) {
if (*((*p)+1) == 2) {
printf("ok");
return 0;
} else {
printf("not ok");
return 0;
}
}
p++;
}
return 0;
}

你的p声明和赋值的时候有问题,因为a本身就是地址,所以不要&a,而a本身是指向3维数组的数组,那么不能用任意类型的指针的指针来获取,应该用指向三维数组的指针
#include <stdio.h>

int main() {
int a[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int (*p)[3] = a;
while (*p) {
while (**p) {
if (*((*p)+1) == 2) {
printf("ok");
return 0;
} else {
printf("not ok");
return 0;
}
}
p++;
}
return 0;
}追问

a我们可以当做是一个地址而&a之后意思是将数组a的地址取出赋值给二级指针p不是吗
二级指针的意思就是指针的指针 也就是一个地址的地址。这个怎么解释?

追答

你要是这样理解的话,你的p就只能是一个void*类型的指针了,然后你自己控制指针的位移;而且我要提醒你:“二级指针的意思就是指针的指针 也就是一个地址的地址”——归根结题是一个地址,你用一个int**来指向编译器会傻掉的。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-23
int **p = &a;
改成
int (*p)[3] = a;
就可以了

首先解决下你的疑惑。
a[][] 是二维数组,a[0][0]是 int 类型的,而a[0]是 int* 类型的,因此a是一个地址,不需要再加个取地址&,正如一位数组int b[3]; int* p = b; 这样赋值只正确的。二维数组的话,你也可以看成是一个一位数组将其中的a[0]看成A,注意这是个地址,则a[0][0]看成A[0],注意这是个值
int (*p)[3] 是一个指向数组的指针,将a赋值给p,p指向的数组就是a[0],也就是A,A里面有3个元素A[0], A[1], A[2],因此这样赋值是正确的
再说,*p就是A,是个地址,**p就是A[0],是一个值
*((*p)+1) ,先将*p理解成A的话,(*p)+1,就是A+1,也就是A[1],然后*((*p)+1) 再取A[1]的值,因此就是a[1][0]的值,其他的都可以用这个方法类推
第2个回答  2011-11-22
a已经是二级指针了,不用取地址,直接p=a追问

有试过 不行 呵呵

追答

是赋值不能,直接报错,还是运行结果不对呢

追问

我在netbeans下运行的 直接提示运行失败 没有编译错误

追答

int **p=(int **)a;

第3个回答  2011-11-22