了解如何从内部函数更新原始二维数组

Posted

技术标签:

【中文标题】了解如何从内部函数更新原始二维数组【英文标题】:Understanding how to update original 2D array from inside function 【发布时间】:2019-05-14 23:33:42 【问题描述】:

我了解如何将二维数组传递给 C 中的函数,但我希望函数更新原始结构而不是其副本。我该怎么办?为什么我使用的方法会创建结构的副本 - 我的印象是它是另一种等效于使用指针的语法?

感谢您的帮助。我在下面包含了代码 sn-ps:

声明变量

int R[rowsize][colsize], G[rowsize][colsize], B[rowsize][colsize];
int Rnew[rowsize][colsize], Gnew[rowsize][colsize], Bnew[rowsize][colsize];

初始化函数

void blur(int rowsize, int colsize, int R[][428], int G[][428], int B[][428], int Rnew[][428], int Gnew[][428], int Bnew[][428])
. . .

注意:在此函数中,RnewGnewBnew 应该更新 - 每个都是二维数组。我希望这样做 不返回任何内容。

调用函数

blur(rowsize, colsize, R, G, B, Rnew, Gnew, Bnew)

【问题讨论】:

你确定它会复制吗? 声明为int R[][428]的函数参数会自动调整为“指向428数组的指针int”(即int (*)[428])。类型为int [][428] 的数组的函数参数会自动转换为指向该数组第一个元素的指针(并且,由于它是一个数组数组,因此第一个元素是一个数组)并且类型为int (*)[428]。结果是传递给函数的不是数组,而是指向其第一个元素(数组)的指针。使用该指针所做的更改将影响原始数组。 【参考方案1】:

你可以试试这个方法..

# include <stdio.h>
#define rowsize 3
#define colsize 3
int main()

  int R[rowsize][colsize]=1,2,3,4,5,6,7,8,9;
  int Rnew[rowsize][colsize];

  copy_from_R_to_Rnew(R,&Rnew);

  int i,j;

  for(i=0;i<rowsize;i++)
   
     for(j=0;j<colsize;j++)

         printf("\t %d",Rnew[i][j]);
     

     printf("\n");
   
  return(0);


void copy_from_R_to_Rnew(int *R,int *Rnew)

  int i,j;
  for(i=0;i<rowsize;i++)
   
     for(j=0;j<colsize;j++)
         *(Rnew+i*colsize+j) = *(R+i*colsize+j);
     
   

【讨论】:

这不是一个好的答案。它应该在编译时给你几个警告,你的类型不匹配。您没有将 int 指针传递给您的函数。

以上是关于了解如何从内部函数更新原始二维数组的主要内容,如果未能解决你的问题,请参考以下文章

fortran关于数组内部函数的问题

如何在不更改原始数组的情况下更改函数中的数组? [复制]

如何使用 PHP 扩展覆盖内部 Zend 函数?

JNI 啥时候需要复制原始类型的数组?

什么是原始函数、内部函数、内置函数和特殊函数? [关闭]

从提交处理函数内部更新 react/redux 状态