这个指向数组的指针的表示是什么?

时间:2014-11-14 10:13:27

标签: c arrays pointers multidimensional-array

我刚刚遇到过处理多维数组的程序。虽然我有它的摇摆,但有一个我不确定的特殊符号。

我们的想法是将指针传递给多维数组的列,因为2-Dim数组不需要您提及2D矩阵中的行数。因此,指向2D矩阵列的指针pm将传递为:int (*pm)[COLUMN]

这是完整的程序:

#include<stdio.h>
#include<stdlib.h>

const int ROW  = 2;
const int COL=3;

void fill_array(int (*pm)[COL], int row);
void display_array(int m[][COL], int row);

int main(int argc, char const *argv[])
{
    /* code */

    int i,j;
    int m[ROW][COL];

    //CALL function to enter elements
    fill_array(m,ROW);

    //display
    display_array(m,ROW);
    return 0;
}

void fill_array(int (*pm)[COL], int row)
{
    int i,j;

    printf("Please fill the array's content: \n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<COL;j++)
        {
            printf("\n m[%d][%d]: ",i,j);
            scanf("%d", &pm[i][j]);
        }
    }
}

void display_array(int m[][COL], int row)
{
    int i,j;

    printf("\n Array's contents: \n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<COL;j++)
        {
            printf("%d\t", m[i][j]);
        }

        printf("\n");
    }
}

我不确定指向数组的指针的表示。我的意思是我不熟悉指针只是附加到数组的符号。有人可以对此有所了解吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

当数组通过值传递给函数时,它将转换为指向其第一个元素的指针。根据C标准(6.3.2.1 Lvalues,数组和函数指示符)

  

3除非它是sizeof运算符或一元&amp;的操作数。   operator,或者是用于初始化数组的字符串文字,a   具有类型''数组类型''的表达式将转换为   带有''指向类型'的指针的表达式,指向初始值   数组对象的元素,而不是左值。如果是数组对象   具有寄存器存储类,行为未定义。

如果您传递此数组

int m[ROW][COL];

到一个函数,它被转换为指向第一个元素的指针,而第一个元素又是int[COL]类型的数组。指向此数组的指针将类似于

int ( * )[COL]

如果您将取消引用此指针,您将获得类型为int[COL]

的一维数组

例如,如果您声明指向一维数组的指针,如

int ( *pm )[COL]

然后表达

*pm

的类型为int[COL]

表达式*pm等同于pm[0]由于pm[0]是一个数组,因此您可以再次应用下标运算符pm[0][0]并获取类型{的第一个元素{2}}二维范围。

答案 1 :(得分:1)

作为函数的参数,int m[][COL]等同于int (*m)[COL],同样int v[]等同于int *v。在这两种情况下,m都被视为指向大小为COL的整数数组的指针。

重要的一点是,*m(解除引用m)会为您提供第一个数组(就像*v为您提供该向量中的第一个元素)。 m上的指针算法按预期工作,例如*(m+1)为您提供第二个数组。因此,您可以将m索引为函数内部的二维数组(m[i][j])。

答案 2 :(得分:-1)

我仍然是C的新手,但我相信它是一个指针数组的指针。我知道如何制作动态二维数组的唯一方法就是这样。

答案 3 :(得分:-1)

好吧,如果我可以说真实的事实是在C / C ++中没有比在内存中分配连续空间更多的数组。有一个指针指向分配的内存块的开头。在这种情况下,如果你有[10] int元素的数组,分配的空间大约是sizeof(int)* 10,指针指向第一个元素。因此,您可以轻松地增加++和减少 - 移动。

对于维数组,很容易将指针传递给它们的第一个元素并逐渐增加到列。但是,您可以使用单个指针轻松处理数组[2] [3]。您只需要乘以2 * 3即可捕获整个分配的内存块。