0

为什么我们不能直接将二维数组的地址分配给指针?

有什么方法可以在一行中分配它,而不是借助for循环?

还有其他更好的方法吗?

// Array of 5 pointers to an array of 4 ints 

int (*Aop[5])[4];

for(int i = 0;i<5;i++) 
{
    Aop[i] = &arr2[i];  //Works fine
} 
 
//Why this doesn't work int 
int (*Aop[5])[4] = &arr2[5][4]
4

2 回答 2

2

本声明

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
于 2021-03-03T17:13:33.540 回答
0

这些可以很好地声明指向整个数组的指针:

int (*Ap)[4] = arr2;

int (*Bp)[5][4] = &arr2;

数组的大小只出现在它的声明中,而不是在传递它时出现。 arrs[5][4]是一个越界数组访问(超出一整行和一整列的范围,因此您甚至不能通过避免左值到右值的转换来合法地将其用作过去的引用)

于 2021-03-03T17:17:58.040 回答