C中的2D数组指针

时间:2014-04-13 00:59:46

标签: c arrays pointers multidimensional-array

我有功能和主要

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>

setArray(double *thearray){
    *thearray[0][0] = 2.0;
    *thearray[0][1] = 2.0;
    *thearray[1][0] = 2.0;
    *thearray[1][1] = 2.0;
}

void main(){
    double myarray[2][2];
    setArray(&myarray);
}

我无法在setArray函数上指定数组的大小,因为我不知道它是什么。我需要在这个特定的功能中填满阵列,但我不能。得到错误:

test.c: In function ‘setArray’:
test.c:8:13: error: subscripted value is neither array nor pointer nor vector
test.c:9:13: error: subscripted value is neither array nor pointer nor vector
test.c:10:13: error: subscripted value is neither array nor pointer nor vector
test.c:11:13: error: subscripted value is neither array nor pointer nor vector
test.c: In function ‘main’:
test.c:16:1: warning: passing argument 1 of ‘setArray’ from incompatible pointer type [enabled by default]
test.c:7:1: note: expected ‘double *’ but argument is of type ‘double (*)[2][2]’

4 个答案:

答案 0 :(得分:2)

您可以使用VLA:

void setArray(int m, int n, double arr[m][n])
{
    for (int r = 0; r < m; ++r)
        for (int c = 0; c < n; ++c)
             arr[r][c] = 2.0;
}

int main()
{
    double myarray[2][2];
    setArray(2, 2, myarray);
}

在C99中支持VLA,在C11中是可选的。如果您的编译器不支持VLA,则无法满足您的要求。但是,您可以将数组作为1-D数组传递,并使用算术找到正确的元素:

void setArray(int num_rows, int num_cols, double *arr)
{
#define ARR_ACCESS(arr, x, y) ((arr)[(x) * num_cols + (y)])
    for (int r = 0; r < num_rows; ++r)
        for (int c = 0; c < num_cols; ++c)
             ARR_ACCESS(arr, r, c) = 2.0;
#undef ARR_ACCESS
}

int main()
{
    double myarray[2][2];
    setArray(2, 2, (double *)&myarray);
}

答案 1 :(得分:0)

试试这个:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>

void setArray(double **thearray){
    thearray[0][0] = 2.0;
    thearray[0][1] = 2.0;
    thearray[1][0] = 2.0;
    thearray[1][1] = 2.0;
}

void main(){
    int i;
    double **myarray = (double**) malloc(2 * sizeof(double*));
    for(i = 0; i < 2; ++i)
        myarray[i] = (double*) malloc(2 * sizeof(double));
    setArray(myarray);
}

答案 2 :(得分:0)

首先,您的setarray应该接受2D数组,而不是poniter。如果知道数组的宽度,可以这样定义:

void setArray(double (*thearray)[2]) //2D array decays into a pointer to an array

然后打电话:

setArray(myarray)

数组仅衰减一次指针,因此2D数组不会衰减为指针指针。 如果宽度不固定,请使用指针指针:

void setArray(double **thearray)
{
    ...
}

setArray((double **)myarray) //explicitly convert.

答案 3 :(得分:-1)

2D数组有一个双指针(**)。当您将数组作为参数发送时,您不需要将&符号作为数组添加,而不使用括号是地址。