了解C

时间:2016-07-02 10:35:55

标签: c arrays pointers

#include<stdio.h>
int main( ) 
{ 
    int s[5][2] = { { 1234, 56 }, { 1212, 33 }, { 1434, 80 }, { 1312, 78 } } ;
    int ( *p )[2];
    int i, j, *pint ;
    for ( i = 0 ; i <= 3 ; i++ ) 
    { 
        p = &s[i] ;
        pint = (int *)p ;
        printf ( "\n" ) ; 
        for ( j = 0 ; j <= 1 ; j++ ) 
            printf ( "%d ", *( pint + j ) ) ; 
    } 
    return 0;
}

这是输出:

1234 56
1212 33 
1434 80 
1312 78

为什么在int(*p)[2]中使用2。我们不能使用3,4或任何其他数字吗? p(int *)p是什么意思? 那么p=&s[i];在代码中的意义是什么?

2 个答案:

答案 0 :(得分:1)

因为它是指向两个int的数组的指针,并且被分配了s的元素,这些元素也是两个int的数组(必须匹配来自的最后一个维度)那个数组)。

这里实际上没有必要,因为它只是临时变量,会立即分配给pint,因此可以直接从s[i]分配到pint

此外,您询问的表达方式错误:

    pint = (int *)p ;

应该是:

    pint = *p ;

这在语义上是正确的。第一个只是因为指针指向数组开始的同一个内存,但它很容易出错,因为编译器没有检查。

答案 1 :(得分:0)

在您的代码s中是一个5×2数组。在C中,2-D数组是一个数组数组,因此s实现为包含两个元素的五个数组的数组。

如果指针的类型与数组元素的类型匹配,则可以使用指针访问数组元素。因此,要访问5×2数组,您需要一个指向两个数组的指针。在C中声明这种指针的语法如下:

int(*p)[2]
  

我们不能使用3,4或任何其他数字吗?

没有。该数字必须与s元素数组的大小相匹配才能使分配正常工作。

  

代码中p=&s[i];的重要性是什么?

其含义与任何其他类型的数组相同:&s[i]生成指向数组i的元素s的指针。等效表达式为p = s+i;