在KR C book page 112中,它说:
int (*arr1)[10];
是指向10个整数数组的指针。我不明白上面和之间的区别:
int arr2[10];
1- Isn' t arr2
本身是指向10个整数数组的指针? (因为数组的名称本身就是指针。)
2-如果数组的名称是数组地址和指向该数组的指针,那么arr1
和arr2
都是指向整数数组的指针,这不是真的吗? / p>
答案 0 :(得分:5)
Isn&#t; trr2本身是指向10个整数数组的指针吗?
不,它是一个数组。
数组的地址和指向该数组的指针是不是数组的名称?
数组名称可以转换为指针到它们的第0个元素(而不是整个数组)。
所以arr1和arr2都是指向整数数组的指针吗?
没有
arr1
是指向10个整数数组的指针。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
视为&#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
的数组10int (*arr1)[10]; 将arr1声明为指向int
的数组10的指针