C - 结构和列表

时间:2013-01-19 11:56:34

标签: c arrays

我想将两个数组的笛卡尔积保存为一个多维数组。

arr[number][0] - 来自第一个数组的数字
arr[number][1] - 第二个数组中的数字

number = sizeof(array1)* sizeof(array2)

int main() {
    int arr1[4] = {1, 4, 2, 3};
    int arr2[4] = {4, 1, 3, 3};
    int **outcomes = getProduct(arr1, 4, arr2, 4);

    int i;
    for(i = 0; i < 16; i++)
        printf("%d", outcomes[i][0]);

    getchar();
}

int* getProduct(int arr1[], int size1, int arr2[], int size2) {
    int **outcomes = (int *)malloc(sizeof(int)*16), count = 0, i, j;

    for(i = 0; i < size1; i++) {
        for(j = 0; j < size2; j++) {
            outcomes[count][0] = arr1[i];
            outcomes[count][1] = arr2[j];
            count++;
        }
    }
    return outcomes;
};

但是,这个代码在getProduct()函数内的嵌套循环中扼杀了。逻辑是可以的,我的问题可能是指针。

  1. 为什么我需要用两个指针初始化多维数组?
  2. 为什么这段代码不起作用?
  3. 对于我如何改进此代码,您有什么建议吗? (我没有在C中编码太多,所以我不知道“好”代码使用哪种结构。)

1 个答案:

答案 0 :(得分:1)

函数getProduct将失败,因为您将指向int(即int*)的指针指向指向int指针的指针(即int**)。

Why do I need to initialize multidimentional arrays with two pointers? 

由于

int**(指向int指针的指针) - 通过这个,我们可以访问任何行和任何列的元素,这是单个指针(或单维数组)无法实现的

类似地int***可以用于三维数组,换句话说,指向指向int指针的指针

   To improve the code

我认为你的笛卡尔积函数看起来应该是这样的

int** getProduct(int arr1[], int size1, int arr2[], int size2) {
    int **outcome = malloc(sizeof(int*)*size1);        
    int i,j;
    for(i = 0;i<size1;i++)
     outcome[i] = malloc(sizeof(int)*size2);
    for(i = 0; i < size1; i++) {
        for(j = 0; j < size2; j++) {
            outcome[i][j] = arr1[i] * arr2[j];
        }
    }
    return outcome;
}

你的主要()就像这样

int main() {
    int arr1[4] = {1, 4, 2, 3};
    int arr2[4] = {4, 1, 3, 3};
    int **outcomes = getProduct(arr1, 4, arr2, 4);

    int i,j;
    for(i = 0; i < 4; i++){
     for(j = 0;j <4; j++){
        printf("%d  ", outcomes[i][j]);
     }
     printf("\n");
    }
    getchar();
}