指向整数数组和正常整数数组的指针

时间:2016-09-22 01:42:12

标签: c arrays pointers types kr-c

在KR C book page 112中,它说:

int (*arr1)[10];

是指向10个整数数组的指针。我不明白上面和之间的区别:

int arr2[10];

1- Isn' t arr2本身是指向10个整数数组的指针? (因为数组的名称本身就是指针。)

2-如果数组的名称是数组地址和指向该数组的指针,那么arr1arr2都是指向整数数组的指针,这不是真的吗? / p>

3 个答案:

答案 0 :(得分:5)

  

Isn&#t; trr2本身是指向10个整数数组的指针吗?

不,它是一个数组。

  

数组的地址和指向该数组的指针是不是数组的名称?

数组名称可以转换为指针到它们的第0个元素(而不是整个数组)。

  

所以arr1和arr2都是指向整数数组的指针吗?

没有

  1. arr1是指向10个整数数组的指针。
  2. arr2是一个包含10个整数的数组。在大多数情况下,它会转换为指向整数的指针(不是指向数组的指针)。
  3. 例如,检查此错误的示例:

    #include <stdio.h>
    
    int main(void)
    {
        int arr2[10] = {0};
        arr2[5] = 747;
    
        int (*arr1)[10] = {0};
        arr1[5] = 747;
    
        return 0;
    }
    

    在这里,我将arr1arr2视为&#34;同样的事情&#34;,我收到了这个错误:

    C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c 
    main.c:9:13: error: array type 'int [10]' is not assignable
        arr1[5] = 747;
        ~~~~~~~ ^
    1 error generated.
    

    但如果我这样做:

    arr1[0][5] = 747;
    

    它将通过编译!当然与(*arr1)[5] = 747;相同。

答案 1 :(得分:1)

数组和指针之间的关系是C中比较混乱的方面之一。请允许我通过举例的方式解释。以下代码填充并显示一个简单的一维数组:

void showArray( int *ptr, int length )
{
    for ( int i = 0; i < length; i++ )
        printf( "%d ", ptr[i] );
    printf( "\n" );
}

int main( void )
{
    int array[10];
    for ( int i = 0; i < 10; i++ )
        array[i] = i;
    showArray( array, 10 );
}

您可以看到,当数组传递给函数时,数组名称将被视为指向数组第一个元素的指针。在此示例中,第一个元素是int,因此指针是int *

现在考虑填充和打印二维数组的代码:

void showArray( int (*ptr)[10], int rows, int cols )
{
    for ( int r = 0; r < rows; r++ )
    {
        for ( int c = 0; c < cols; c++ )
            printf( "%2d ", ptr[r][c] );
        printf( "\n" );
    }
}

int main( void )
{
    int array[5][10];
    for ( int row = 0; row < 5; row++ )
        for ( int col = 0; col < 10; col++ )
            array[row][col] = row * 10 + col;
    showArray( array, 5, 10 );
}

数组名仍然是指向数组第一个元素的指针。但是在这个例子中,数组的第一个元素本身就是一个数组,特别是一个10 int的数组。所以函数中的指针是指向10 int 数组的指针。

我希望给你留下深刻印象的是(int *ptr)[10]形式的指针与二维数组有一些对应关系,而int *ptr形式的指针与一个指针有一些对应关系。维数组。

答案 2 :(得分:0)

cdecl.org将向您展示C将您的变量声明解释为。当你开始进入更复杂的变量声明时非常方便。

int arr2[10];  将arr2声明为int

的数组10

int (*arr1)[10];  将arr1声明为指向int

的数组10的指针