我正在做一个用C语言创建一个完整矩阵套装的项目。这可以做大多数与矩阵相关的事情。我已经成功地在Python中完成了它。但我正试图用C实际需要它。我想要这样做的方法是为单独的模块创建单独的文件。但我真的很困惑数组和指针。我知道指针代表了该值的地址。
我想做什么:
我不明白的事情:
如何从函数返回数组?
或如何从函数返回2D指针值?或访问它?
我的代码有什么问题吗?
我得到的错误:
matrix_in.c:17:9:警告:从不兼容的指针类型返回[-Wincompatible-pointer-types]
matrix.c:9:5:警告:从不兼容的指针类型分配[-Wincompatible-pointer-types]
matrix.c:16:11:警告:格式'%d'需要类型为'int'的参数,但参数2的类型为'int(*)[5]'[-Wformat =]
到目前为止,我的代码如下:
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;
}
答案 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;