鱼C论坛

 找回密码
 立即注册
查看: 1164|回复: 7

[已解决](int (*)[3])&array这个为什么是强制转化成3*3数组?

[复制链接]
发表于 2020-9-11 21:28:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源于小甲鱼的作业题。。我猜到了,但我解释不通原理。。
#include <stdio.h>

int main()
{
        int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int (*p)[3] = (int (*)[3])&array;

        printf("%d\n", p[2][2]);

        return 0;
}
最佳答案
2020-9-11 22:09:57
int (*p)[3],p的类型不是 int* 型,而是 int(*)[3] 型,p 被定义为指向一维整型数组的指针变量,一维数组有3个元素,相当于 array[0][0]、array[0][1]、array[0][2]、array[1][0]、array[1][1]、array[1][2]、array[2][0]、array[2][1]、array[2][2],它就是一个 3 * 3 的数组,然后将一维数组的值赋给这个指针数组

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-11 21:58:22 | 显示全部楼层
数组是顺序排列,函数传参实际传递的是数组的初始地址。是可以改变行列长度的,甚至还可以改变维度。
下图是我之前回答某个帖子的时候做的图,配合下面的程序看一下效果
数组索引.jpg
#include <stdio.h>
void func1(int c[])
{
    printf("c[8]=%d\n", c[8]);
}
void func(int b[][3])
{
    printf("b[2][2]=%d\n", b[2][2]);
}
int main()
{
    int a[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    func(a);
    func1(a);
    return 0;
}

你的这个程序中,原数组是一维数组,长度为9,然后将数组地址赋值给长度为3的数组指针,相当于把原来长度为9的一维数组变为了3*3的二维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-11 22:09:57 | 显示全部楼层    本楼为最佳答案   
int (*p)[3],p的类型不是 int* 型,而是 int(*)[3] 型,p 被定义为指向一维整型数组的指针变量,一维数组有3个元素,相当于 array[0][0]、array[0][1]、array[0][2]、array[1][0]、array[1][1]、array[1][2]、array[2][0]、array[2][1]、array[2][2],它就是一个 3 * 3 的数组,然后将一维数组的值赋给这个指针数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-12 01:02:30 | 显示全部楼层
风过无痕1989 发表于 2020-9-11 22:09
int (*p)[3],p的类型不是 int* 型,而是 int(*)[3] 型,p 被定义为指向一维整型数组的指针变量,一维数组 ...

谢谢!!!我懂了!!淦,原来那个()是强制转换啊!
不过,这个int(*)[3] 变量类型的写法好怪。。以前没见过
请问大大能给更多相关的介绍吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-12 02:07:56 | 显示全部楼层
greenery 发表于 2020-9-12 01:02
谢谢!!!我懂了!!淦,原来那个()是强制转换啊!
不过,这个int(*)[3] 变量类型的写法好 ...

int(*)[3]型,p被定义为指向一维整型数组的指针变量,一维数组有3个元素,因此p的基类型是一维数组,其长度是12字节。“*(p+2)+2"括号中的2是以p的基类型(一维整型数组)的长度为单位的,即p每加1,地址就增加12个字节(3个元素,每个元素4个字节),而“*(p+2)+2"括号外的数字2,不是以p的基类型的长度为单位的。由于经过*(p+2)的运算,得到a[2],即&a[2][0],它已经转化为指向列元素的指针了,因此加2是以元素的长度为单位的,加2就是加(2×4)个字节。虽然p+2和*(p+2)具有相同的值,但由于它们所指向的对象的长度不同,因此(p+2)+2和*(p+2)+2的值就不相同了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-23 10:36:21 From FishC Mobile | 显示全部楼层
右边怎么看也看不懂。按运算符顺序来看,右边怎么解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-23 12:41:18 | 显示全部楼层
最佳答案是错的,这不是3*3数组,只能说明矩阵的列是3而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-23 15:12:56 From FishC Mobile | 显示全部楼层
右边的意思是将本来跨度为九个int的地址强制截取成跨度为三个int的地址?可是为什么?没见一个回答是解释到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-10 06:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表