繁体   English   中英

在指向数组的指针中使用类型转换

[英]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 **

编辑:这是错误的


p是(*)[2]类型

int s[4][2] ;

s的类型:int **

编辑:s是(*)[2]而非**的类型


s [i]的类型:int *
s [i] [j]的类型:int

感谢评论者,谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM