首先说:没有关系!
先告诉自己三遍:没有关系,没有关系,没有关系
例:
#include <stdio.h>
int main(void){
int arr[3][2] = {{1, 2}, {3, 4},{5,6}};
int *p1 = arr[0]; //一级指针
int **p2 = arr; // 二级指针,即指针的指针
int (*p3)[2] = arr; // 指向一个内含两个int类型值数组
printf("**p2 = %d\n", **p2);
printf("**p3 = %d\n", **p3);
printf("p2 = %p, *p2 = %p\n", p2, *p2);
printf("p3 = %p, *p3 = %p\n", p3, *p3);
return 0;
}
编译运行结果如下:
从不兼容的指针类型初始化
原因:
p2是指针的指针,它指向的指针指向int
int a;
int * p;
int **p2;
a = 1;
p = &a;
p2 = &p;
而数组名arr表示指向数组的指针,数组内含2个int类型的元素
先来看下:
int (*p3)[2] = arr; // 指向一个内含两个int类型值数组
p2和arr就不是同一种类型。
也就是说,*p2指向a[0]。然而a[0]并不是int 类型的变量,与p2应该指向的类型不同,因此在初始化时编译器会发现类型不匹配,产生编译错误。