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

时间:2016-04-03 08:32:32

标签: c arrays pointers

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数组的地址而不是元素。为什么呢?

2 个答案:

答案 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   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。如果是数组对象   具有寄存器存储类,行为未定义。

因此,除了作为sint[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 **的类型

编辑:这是错误的


p的类型为(*)[2]

int s[4][2] ;

s的类型:int **

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


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

的类型

感谢评论员,谢谢。