[英]Use of typecasting in pointer to an array
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个一维数组的地址。 但是为什么我们将p强制转换为品脱呢? 并将品脱用于我们的程序的其余部分。 为什么我们不能仅使用p而不是品脱?
另外,我尝试用p代替品脱,但是它是打印一维数组的地址而不是元素。 为什么?
对于初学者来说,写起来会更正确
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左值,数组和函数指示符)
3除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“ array of type”的表达式将转换为类型为“ pointer”的表达式键入'',它指向数组对象的初始元素,不是左值。 如果数组对象具有寄存器存储类,则该行为是不确定的。
因此,在表达式中使用的类型为int[4][2]
数组s
用作sizeof
或&
操作的操作数除外)将转换为指向类型为int ( * )[2]
第一个元素的指针
如果将运算符*
应用于指针,则结果对象的类型将为int[2]
,即数组。 再次在表达式中将其转换为指向类型为int *
第一个元素的指针。
因此表达式*p
类型为int *
。 如果将其用于sizeof
运算符,则其类型为int[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 **
感谢评论者,谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.