int s[4][2] = {1234,56,1212,33,1434,80,1312,78} ;
int (*p)[2], i, j;
int *pint;
for(i=0;i<=3;i++)
{
p = s[i];
pint = (int*) p;
for(j=0;j<=1;j++)
{
printf("%d ",*(pint+j));
}
printf("\n");
}
这里,p是指向2个整数数组的指针,p包含第i个1-D数组的地址。但是为什么我们要将品脱p?并使用品脱用于我们程序的其余部分。为什么我们不能仅使用p而不是pint?
另外,我尝试用p而不是pint,但是它打印的是1-D数组的地址而不是元素。为什么呢?
答案 0 :(得分:2)
对于初学者来说,编写
更为正确pint = *p;
而不是
pint = (int*) p;
这个表达式声明
p = s[i];
也错了。 s [i]具有在表达式中使用的类型int[2]
被隐式转换为类型为int *
的对象。左侧操作数的类型为int ( * )[2]
。因此,尝试使用类型为int( * )[2]
的表达式分配类型为int *
的指针。但是类型不兼容。
你必须写
p = &s[i];
或
p = s + i;
当然,没有必要引入一个新的指针来输出数组的元素。但是,使用附加指针可以简化构造。
在不引入新指针的情况下,循环可能看起来像
for ( i = 0; i < 4; i++ )
{
p = s + i;
for ( j = 0; j < 2; j++ )
{
printf( "%d ", *( *p + j ) );
}
printf( "\n" );
}
来自C标准的引用将有所帮助(6.3.2.1 Lvalues,数组和函数指示符)
3除非它是sizeof运算符或一元&amp;的操作数。 operator,或者是用于初始化数组的字符串文字,a 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素,而不是左值。如果是数组对象 具有寄存器存储类,行为未定义。
因此,除了作为s
或int[4][2]
操作的操作数之外,在表达式中使用类型sizeof
的数组&
将转换为指向其{{1}类型的第一个元素的指针1}}
如果要将操作符int ( * )[2]
应用于指针,则结果对象的类型将为*
,即数组。在表达式中,它又转换为指向其第一个int[2]
类型元素的指针。
因此,表达式int *
的类型为*p
。如果它将在int *
运算符中使用,则它具有类型sizeof
。
答案 1 :(得分:-2)
int a[2] ;
等同于:
int *a ;
a = malloc(sizeof(int) * 2);
int a[4][2] ;
相当于:
int **a ;
a = malloc(sizeof(int *)*4);
for ( i = 0 ; i < 2 ; ++i){
*(a+i) = malloc(sizeof(int)*2);
}
int (*p)[2];
p:int **的类型
int s[4][2] ;
s的类型:int **
的类型
感谢评论员,谢谢。