【问题标题】:How do I add two matrixes using pointers in c?如何在c中使用指针添加两个矩阵?
【发布时间】:2016-11-22 19:06:23
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void adder(int **matrix1, int **matrix2, int **matrix3) {

  for(int i = 0; i < 3; i++){
    for(int j = 0; j < 3; j++){
      matrix3[i][j] = matrix1[i][j] + matrix2[i][j];
    }
  }

}

int main() {

int matrix1[3][3] = {{1,1,1},{1,1,1},{1,1,1}};
int matrix2[3][3] = {{2,2,2},{2,2,2},{2,2,2}};
int matrix3[3][3];

adder(matrix1, matrix2, matrix3);

for(int i = 0; i < 3; i++){
  for(int j = 0; j < 3; j++){
    printf("%d\t", matrix3[i][j]);
  }
  printf("\n");
}
}

执行此操作时没有错误,但警告说“从不兼容的指针传递参数”。我尝试使用 int *matrix1 将加法器输入作为指针使用,但这也不起作用。

我能做什么?

【问题讨论】:

  • 将 int **matrix1 替换为 int matrix1[3][3],对其他参数执行相同操作。或者使用 malloc 分配 matrix1
  • void adder(int (*matrix1)[3], int (*matrix2)[3], int (*matrix3)[3]) {
  • 也许question#5329107 可能会有所帮助
  • 是的,这行得通,但任务是专门使用指针。

标签: c function pointers matrix


【解决方案1】:

int **int[3][3] 的类型不同。

int ** 是(在这里使用的)指向int * 指针数组的指针,其中每个指针都指向ints 数组。以图形形式:

            +-------+     +-----+
int **a --> | int * ----> | int |
            | int * |     | int |
            | int * |     | int |
            +-------+     +-----+

int[3][3] 是由 9 个ints 组成的单个数组,旨在作为 3x3 数组访问。这种类型的变量可以被视为int *,但指向的数组表现为指针,而不是双指针。它没有int ** 中看到的额外间接级别。

【讨论】:

    【解决方案2】:

    即使数组与指针类型兼容,这也不适用于多维数组。您只能转换最外面的维度。长话短说:

    • 这会丢失有关大小的信息。对于最外层,这没关系,因为它总是有一个线性布局。但是内部数组会失去它的大小。

    • 指向对象指针的指针至少需要两个指针。这是显而易见的。多维数组内部没有额外的指针。

    有一些解决方案:

    制作参数的类型

    • 指向内部数组 (dimensions-1) 的指针:int (*m)[3]

    • 外维度不完整的数组:int m[][3]

    • 真实维度:int m[3][3]

    • 或者 - 在你的情况下 - 让它成为一个简单的指向 int 的指针并遍历一个一维数组,这将在你的情况下工作:int *m

    【讨论】:

    • 数组与指针类型兼容!试试sizeof(int[9]) == sizeof(int *)。而且由于多维数组只是数组的一维数组,因此也不例外。
    • 我知道。这就是我称之为类型-兼容的方式,而不是等效的。兼容性和等效性是不一样的。
    • 它们肯定也不是类型兼容的(如果它们是,它们也是等价的!)。这正是int [][] 无法转换为int ** 的原因正是。初学者已经有足够的困惑,而这种错误的陈述只会使情况变得更糟。
    • 不,这不是原因。 [][] 不能转换为 ** 反之亦然的原因是,正如我的回答中所解释的那样,对象是不同的。也许你误解了兼容这个词。兼容性和等效性仍然是不同的东西。这就是为什么它有两个不同的术语的原因。
    • 术语兼容类型在标准中完全定义!我不会误会的。不要试图对这些定义明确的术语强制执行您自己的定义!
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多