greenery 发表于 2020-9-11 21:28:19

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

源于小甲鱼的作业题。。我猜到了,但我解释不通原理。。{:10_262:}

#include <stdio.h>

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

      printf("%d\n", p);

      return 0;
}

sunrise085 发表于 2020-9-11 21:58:22

数组是顺序排列,函数传参实际传递的是数组的初始地址。是可以改变行列长度的,甚至还可以改变维度。
下图是我之前回答某个帖子的时候做的图,配合下面的程序看一下效果

#include <stdio.h>
void func1(int c[])
{
    printf("c=%d\n", c);
}
void func(int b[])
{
    printf("b=%d\n", b);
}
int main()
{
    int a = {
      {1, 2, 3, 4},
      {5, 6, 7, 8},
      {9, 10, 11, 12}
    };
    func(a);
    func1(a);
    return 0;
}

你的这个程序中,原数组是一维数组,长度为9,然后将数组地址赋值给长度为3的数组指针,相当于把原来长度为9的一维数组变为了3*3的二维数组

风过无痕1989 发表于 2020-9-11 22:09:57

int (*p),p的类型不是 int* 型,而是 int(*) 型,p 被定义为指向一维整型数组的指针变量,一维数组有3个元素,相当于 array、array、array、array、array、array、array、array、array,它就是一个 3 * 3 的数组,然后将一维数组的值赋给这个指针数组

greenery 发表于 2020-9-12 01:02:30

风过无痕1989 发表于 2020-9-11 22:09
int (*p),p的类型不是 int* 型,而是 int(*) 型,p 被定义为指向一维整型数组的指针变量,一维数组 ...

谢谢!!!我懂了!!淦,原来那个()是强制转换啊!{:10_298:}
不过,这个int(*) 变量类型的写法好怪。。以前没见过{:10_258:}
请问大大能给更多相关的介绍吗{:10_254:}

风过无痕1989 发表于 2020-9-12 02:07:56

greenery 发表于 2020-9-12 01:02
谢谢!!!我懂了!!淦,原来那个()是强制转换啊!
不过,这个int(*) 变量类型的写法好 ...

int(*)型,p被定义为指向一维整型数组的指针变量,一维数组有3个元素,因此p的基类型是一维数组,其长度是12字节。“*(p+2)+2"括号中的2是以p的基类型(一维整型数组)的长度为单位的,即p每加1,地址就增加12个字节(3个元素,每个元素4个字节),而“*(p+2)+2"括号外的数字2,不是以p的基类型的长度为单位的。由于经过*(p+2)的运算,得到a,即&a,它已经转化为指向列元素的指针了,因此加2是以元素的长度为单位的,加2就是加(2×4)个字节。虽然p+2和*(p+2)具有相同的值,但由于它们所指向的对象的长度不同,因此(p+2)+2和*(p+2)+2的值就不相同了。

哦好啊 发表于 2020-10-23 10:36:21

右边怎么看也看不懂。按运算符顺序来看,右边怎么解释

资治通鉴 发表于 2020-10-23 12:41:18

最佳答案是错的,这不是3*3数组,只能说明矩阵的列是3而已

哦好啊 发表于 2020-10-23 15:12:56

右边的意思是将本来跨度为九个int的地址强制截取成跨度为三个int的地址?可是为什么?没见一个回答是解释到的
页: [1]
查看完整版本: (int (*)[3])&array这个为什么是强制转化成3*3数组?