用C语言编写矩阵的二维数组和指针操作

时间:2015-08-05 16:16:50

标签: c arrays pointers matrix

我正在做一个用C语言创建一个完整矩阵套装的项目。这可以做大多数与矩阵相关的事情。我已经成功地在Python中完成了它。但我正试图用C实际需要它。我想要这样做的方法是为单独的模块创建单独的文件。但我真的很困惑数组和指针。我知道指针代表了该值的地址。

我想做什么:

  1. 创建一个函数模块,询问行n列号n然后接受矩阵n的输入然后将包含矩阵的数组返回到另一个空数组,这样我每次需要矩阵输入时都可以调用该函数。
  2. 我不明白的事情:

    1. 如何从函数返回数组?

    2. 或如何从函数返回2D指针值?或访问它?

    3. 我的代码有什么问题吗?

    4. 我得到的错误:

      1. matrix_in.c:17:9:警告:从不兼容的指针类型返回[-Wincompatible-pointer-types]

      2. matrix.c:9:5:警告:从不兼容的指针类型分配[-Wincompatible-pointer-types]

      3. matrix.c:16:11:警告:格式'%d'需要类型为'int'的参数,但参数2的类型为'int(*)[5]'[-Wformat =]

      4. 到目前为止,我的代码如下:

        header / * header.h * /

        #ifndef HEADER_H_INCLUDED
        #define HEADER_H_INCLUDED
        
        #define LIMIT_X 100
        #define LIMIT_Y 100
        int* matrix_in();
        
        #endif
        

        matrix_in     / * matrix_in.c * /

        #include <stdio.h>
        #include "header.h"
        
        int* matrix_in()
        {
            int i,j;
            //int* point;
            static int (*array)[LIMIT_X][LIMIT_Y];
            printf("please enter the elements:\n");
            for (i=0;i<2;i++)
            {
                for (j=0;j<2;j++)
                {
                    scanf("%d",array[i][j]);
                }
            }
            return array;
        }
        

        矩阵     / * matrix.c * /

        #include <stdio.h>
        #include "header.h"
        
        int main()
        {
            int m1[2][2],m2,i,j;
            int (*p1)[5][5];
        
            p1 = matrix_in();
            //p2 = matrix_in();
        
            for (i=0;i<2;i++)
            {
                for (j=0;j<2;j++)
                {
                    printf("%d\t", *p1);
                    p1++;
                }
            }   
            return 0;
        }
        

3 个答案:

答案 0 :(得分:1)

如果我正确的话,就好像你想要调用一个加载矩阵的函数,然后返回这个矩阵以存储在别处的数组中。

您问题的简单解决方案是编写int (*p1)[5][5]实际上是 3维数组。它需要更改为像int** p1;这样的二维数组,然后可以使用下面的代码块填充它。

您必须更改matrix_in()中的返回类型。目前,您正在尝试返回int*,这是一维的一维数组。这需要更改为int**

修改

所以说例如我想要一个函数来加载带有一堆值的二维数组,然后返回这个数组。我可以这样写:

编辑2: 由于WhozCraig的评论,我意识到我需要做出一些改变

编辑3: 将代码从c ++语法更改为c语法(对于抱歉的问题感到困惑)

int** loadArray(int rows, int cols)
{
    int** array_to_return = (int**)malloc(rows * sizeof(int*)); // define one of two dimensions
    int value_to_increment = 0;

    for (int i = 0; i < rows; i++)
    {
        array_to_return[i] = (int*)malloc(cols * sizeof(int)); //define other dimension
    }

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            array_to_return[i][j] = value_to_increment; // fill each index with value
            value_to_increment++;
        }
    }

    return array_to_return;
}

此函数使用顺序值加载数组,然后返回数组。现在,因为我们malloc,你需要在某个时刻free()数组,以避免内存泄漏。

答案 1 :(得分:1)

C中的数组表示为连续的内存块,指针指向第0个元素。因此,数组通常如下所示:

---------------------
| 0 | 1 | 2 | 3 | 4 | //A five element array
---------------------
  ^
  |
pointer
to 0th
element

请注意,通过指向数组中的第一个元素,您可以通过简单地递增指针(称为指针算术)来访问数组中的其余元素。因此,如果int *a指向元素0,我们知道我们必须增加a四次才能到达元素4.

二维数组有点棘手;人类会想到这样的二维阵列:

---------------------
| 0 | 1 | 2 | 3 | 4 |  //row 0
---------------------
| 0 | 1 | 2 | 3 | 4 |  //row 1
---------------------

但是,计算机在内存中没有2维的概念;计算机只是看到(理论上)一行无限长的记忆。因此,计算机排列如下的二维数组:

-----------------------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
-----------------------------------------
  ^                   ^
  |                   |
row 0               row 1
begins              begins
here                here

这意味着计算机使用模运算符进行一些简单的算术来访问第1行:

a[x][y] = a[ (y * array_width) + x ]

因此a[1][2]变为a[1 * 5 + 2] = a[7]

这意味着要将指向二维数组的指针传递给一个函数,你仍然只需要将指针传递给数组中的第0个元素。然后,您可以照常访问整个阵列。

其他答案可以更好地解释代码的确切问题 - 我只想确保您了解数组在C中的工作方式:)

答案 2 :(得分:0)

如果你想在矩阵中输入,你可能只需要一个二维数组。宣言就是这个 -

import requests
import json

payload = {'ajax': 1, 'htd': '20131111', 'pn':'p1', 'htv':'l'}
req = requests.post('http://www.google.com/trends/hottrends/hotItems', data=payload)

print req.status_code # Prints out status code
print json.loads(req.text) # Prints out json data

而这 -

int array[n][n];  // 2-d array of integers

两者都不同。 要返回只是声明一个指针,分配内存然后返回指针。 并且意图 -

int (*p1)[5][5];  // p1 is a pointer to a 5 X 5-element array of int

你可以这样声明 -

static int (*array)[LIMIT_X][LIMIT_Y];

返回static int array[LIMIT_X][LIMIT_Y]; -      array

此声明 -

return array;