c语言使用二维数组发牌,C语言能否用二维数组的形式访问一维数组

1cb930fcda8428d79463661bb7713df4.png

饮歌长啸

以下只是个人理解,如有谬误,谢谢指出。首先要明确的概念是:虽然所有指针的大小都是固定的(如 32 位环境下就是 4 个字节),但指针本身是有类型的,或者说,每个指针都只能指向某种特定类型的对象(void *除外),如 int * 指针就只能指向 int 类型数据。然后是数组的类型:我们先声明一个数组int a[10];方便说明,虽然数组名在很多情况下都会被隐式转换成指向数组首元素的指针,给人一种a == &a[0]的错觉,但数组确实是一种单独的类型,举两种情况就能体会到了——&a和sizeof(a),&a 是指向整个数组对象的指针,当我们试图这样写的时候int *p = &a;,编译是通不过的,必须写成int(*p)[10] = &a;,即一个简单的 int 指针是无法接收 &a 的结果的。当我们打印出sizeof(a)的结果,可以看到是 40 字节而不是 4 字节,显然数组名和指针是两码事了。理解了数组是一种特殊的类型,我们就能知道,刚上面声明的 a 其实是长度为 10 的 int 数组类型,即int (*)[10]类型,注意这里的 10 不能忽略,长度是数组类型的一部分。回到问题,p2 是一个指针,因为它指向的是一个长度为 3 的 char 数组,所以其类型是:char (*)[3],而 p1 是一个长度为 12 的 char 数组,所以&p1的类型是:char (*)[12],现在要把&p1赋给 p2,虽然两者都属于指针,即大小是一致的,但类型不一样,所以编译器会报错,真想这么转,需要做个强制转换:p2 = (char(*)[3])&p1;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值