5

In KR C book page 112 it says that following:

int (*arr1)[10];

is a pointer to an array of 10 integers. I don't get what's difference between above and:

int arr2[10];

1- Isn't arr2 itself a pointer to array of 10 integers? (Because name of an array is a pointer itself.)

2- If the name of an array is the array address and pointer to that array, then both arr1 and arr2 are pointer to array of integers, isn't this true?

4

3 回答 3

5

arr2 本身不是指向 10 个整数数组的指针吗?

不,这是一个数组。

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

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

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

不。

  1. arr1是一个指向 10 个整数数组的指针。
  2. arr2是一个由 10 个整数组成的数组。在大多数情况下,它转换为指向整数的指针(而不是指向数组的指针)。

例如检查这个错误的例子:

#include <stdio.h>

int main(void)
{
    int arr2[10] = {0};
    arr2[5] = 747;

    int (*arr1)[10] = {0};
    arr1[5] = 747;

    return 0;
}

在这里,我将两者都arr1视为arr2“同一件事”,并且出现此错误:

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;

于 2016-09-22T01:46:07.747 回答
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 );
}

可以看到,当将数组传递给函数时,数组名被当作指向数组第一个元素的指针。在这个例子中,第一个元素是 an int,所以指针是 an 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一维数组有某种对应关系。

于 2016-09-22T02:13:34.477 回答
0

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

int arr2[10]; 将 arr2 声明为 int 的数组 10

int (*arr1)[10]; 将 arr1 声明为指向 int 数组 10 的指针

于 2016-09-22T04:16:35.780 回答