C 语言指针的指针和二维数组的区别?
为什么:指针的指针不能存二维数组的指针。
如:
1 #include<stdio.h>
2 int main (void)
3 {
4 int a[2][3] = {{1,2,3},{4,5,6}};
5 int ** array_ptr = a;
6 printf("%d\n",a[0][0]);
7 //printf("%d\n",**array_ptr);
8 printf("%p\n",a);
9 printf("%p\n",*a);
10 printf("%p\n",array_ptr);
11 printf("%p\n",*array_ptr);
12 return 0;
13 }
~
编译报警:
test.c: In function ‘main’:
test.c:5:21: warning: initialization from incompatible pointer type
int ** array_ptr = a;
^
运行出错:
1
0x7ffdce0e9b90
0x7ffdce0e9b90
0x7ffdce0e9b90
0x200000001
补充一下:
7 //printf("%d\n",**array_ptr);
这个去掉注释编译运行后会出现段错误,"段错误是什么意思...?"
1.为什么错了?
我先来问你:a的值是什么?a的值是一个指向a这个数组第一个元素的指针,好,那么,a这个数组第一个元素是什么?第一个元素它还是一个数组,所以,结论是a是一个指向数组的指针。而且指向的这个数组还是一个整形数组,当然这个不重要。
默念几遍:a是一个指向数组的指针,a是一个指向数组的指针,a是一个指向数组的指针。
而你声明的
int **array_ptr
是个什么?
假设某个整形指针
int *p
,那么
int **array_ptr=&p
这个是成立的。也就是说啊,
*array_ptr
引用的是整形指针啊。而你的程序中非要用*array_ptr来引用一个数组指针,那肯定就错了。
2.该如何改正?
简单,如下:
int (*array_ptr)[3] = a;
注意:这里为了保险一点,还是将array_ptr指向的数组的长度写上,避免错误。
以上。
你以为你懂了?来个课后小练习吧?
-
声明一个指向整形的指针p
-
声明一个返回整形指针的函数f
-
声明一个指向 返回整形值的函数 的函数指针ff
-
声明一个指向返回整形指针的函数的函数指针fff
-
声明一个指针数组
-
声明一个数组指针
-
变态的:int (*f7[])() ,那么f7的含义?
-
最后一个:int *(*f8[])(),那么 f8的含义?