C 语言指针的指针和二维数组的区别

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指向的数组的长度写上,避免错误。

以上。

你以为你懂了?来个课后小练习吧?

  1. 声明一个指向整形的指针p

  2. 声明一个返回整形指针的函数f

  3. 声明一个指向 返回整形值的函数 的函数指针ff

  4. 声明一个指向返回整形指针的函数的函数指针fff

  5. 声明一个指针数组

  6. 声明一个数组指针

  7. 变态的:int (*f7[])() ,那么f7的含义?

  8. 最后一个:int *(*f8[])(),那么 f8的含义?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值