(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;
}
数组是顺序排列,函数传参实际传递的是数组的初始地址。是可以改变行列长度的,甚至还可以改变维度。
下图是我之前回答某个帖子的时候做的图,配合下面的程序看一下效果
#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的二维数组
int (*p),p的类型不是 int* 型,而是 int(*) 型,p 被定义为指向一维整型数组的指针变量,一维数组有3个元素,相当于 array、array、array、array、array、array、array、array、array,它就是一个 3 * 3 的数组,然后将一维数组的值赋给这个指针数组 风过无痕1989 发表于 2020-9-11 22:09
int (*p),p的类型不是 int* 型,而是 int(*) 型,p 被定义为指向一维整型数组的指针变量,一维数组 ...
谢谢!!!我懂了!!淦,原来那个()是强制转换啊!{:10_298:}
不过,这个int(*) 变量类型的写法好怪。。以前没见过{:10_258:}
请问大大能给更多相关的介绍吗{:10_254:} 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的值就不相同了。 右边怎么看也看不懂。按运算符顺序来看,右边怎么解释 最佳答案是错的,这不是3*3数组,只能说明矩阵的列是3而已 右边的意思是将本来跨度为九个int的地址强制截取成跨度为三个int的地址?可是为什么?没见一个回答是解释到的
页:
[1]