本声明
int (*Aop[5])[4];
不声明指针。它是一个由 5 个指针组成的数组的声明,指向int[4]
.
数组没有赋值运算符。但是,您可以在其声明中对其进行初始化,例如
int (*Aop[5])[4] = { &arr2[0], &arr2[1], &arr2[2], &arr2[3], &arr2[4] };
或者
int (*Aop[5])[4] = { arr2, arr2 + 1, arr2 + 2, arr2 + 3, arr2 + 4 };
这是一个演示程序。
#include <stdio.h>
int main(void)
{
enum { M = 5, N = 4 };
int arr2[M][N] =
{
{ 1, 1, 1, 1 },
{ 2, 2, 2, 2 },
{ 3, 3, 3, 3 },
{ 4, 4, 4, 4 },
{ 5, 5, 5, 5 }
};
int (*Aop[M])[N] = { arr2, arr2 + 1, arr2 + 2, arr2 + 3, arr2 + 4 };
for ( size_t i = 0; i < M; i++ )
{
for ( size_t j = 0; j < N; j++ )
{
printf( "%d ", ( *Aop[i] )[j] );
}
putchar( '\n' );
}
return 0;
}
程序输出为
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
如果您需要声明指向数组的指针,arr2
那么您应该记住,数组指示符被隐式转换(极少数例外)为其第一个元素的指针。该数组arr2
具有类型为 的元素int[4]
。因此,指向此类型对象的指针将具有类型int ( * )[4]
。所以你可以写
int (*Aop )[4] = arr2;
这是另一个演示程序,它使用 for 循环中的指针来输出数组的元素arr2
。
#include <stdio.h>
int main(void)
{
enum { M = 5, N = 4 };
int arr2[M][N] =
{
{ 1, 1, 1, 1 },
{ 2, 2, 2, 2 },
{ 3, 3, 3, 3 },
{ 4, 4, 4, 4 },
{ 5, 5, 5, 5 }
};
int (*Aop )[N] = arr2;
for ( int ( *p )[N] = Aop; p != Aop + M; ++p )
{
for ( int *q = *p; q != *p + N; ++q )
{
printf( "%d ", *q );
}
putchar( '\n' );
}
return 0;
}
程序输出再次是
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5