通过引用传递是一种参数编组策略,其中变量在内存中的位置传递给函数,而不是变量值的副本,尽管函数出现在源代码中以接收变量本身而不是指向它的指针。
我正在寻找一些很好的综合阅读材料,了解 JavaScript 何时按值传递某些内容,何时按引用传递以及修改传递的项目何时影响函数外部的值以及...
如果内存已经分配,函数内数组中的更改是否会保留在主函数或调用函数中?
在此函数定义中,我采用了二维数组地址的参数。 无效动态(int ***a,int r,int c) { *a = (int**)malloc(sizeof(int*)*r); 对于(int i=0;i 在此函数定义中,我采用了二维数组地址的参数。 void dynamic(int ***a,int r,int c) { *a = (int**)malloc(sizeof(int*)*r); for(int i=0;i<r;i++) { (*a)[i] = (int*)malloc(sizeof(int)*c); } } 我正在传递参数,如下所示, dynamic(&a,r1,c1); 如果我直接将二维数组作为参数,那么它就不会接受输入。 但是,在这段代码中,在 add 函数中我没有获取二维数组的地址,而是获取了二维数组本身,但是所做的更改被保留了。 void add(int **a,int **b,int r,int c,int **sum) { static int i=0,j=0; if(i>=r) { return;// sum; } else { if(j<c) { sum[i][j] = a[i][j]+b[i][j]; j++; add(a,b,r,c,sum); } j=0; i++; add(a,b,r,c,sum); } } 但是如果参考添加功能,我得到的是垃圾值。 void add(int **a,int **b,int r,int c,int ***sum) { static int i=0,j=0; if(i>=r) { return; } else { if(j<c) { (*sum)[i][j] = a[i][j]+b[i][j]; j++; add(a,b,r,c,sum); } j=0; i++; add(a,b,r,c,sum); } } #include<stdio.h> #include<stdlib.h> void input(int **a,int r,int c) { for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { scanf("%d",&a[i][j]); } } } void dynamic(int ***a,int r,int c) { *a = (int**)malloc(sizeof(int*)*r); for(int i=0;i<r;i++) { (*a)[i] = (int*)malloc(sizeof(int)*c); } } int** matmul(int **a,int r1,int c1,int **b,int r2,int c2,int **c) { static int i=0,j=0,k=0; if(i>r1) { return c; } else { if(j<c2) { if(k==0) { c[i][j]=0; } if(k<r2) { c[i][j]+= a[i][k]*a[k][j]; k++; printf("product = %d ",c[i][j]); matmul(a,r1,c1,b,r2,c2,c); } k=0; j++; matmul(a,r1,c1,b,r2,c2,c); } j=0; i++; matmul(a,r1,c1,b,r2,c2,c); } } void freeing(int **arr,int r,int c) { for(int i=0;i<r;i++) { free(arr[i]); } free(arr); } void print_array(int **a,int r,int c) { for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { printf("%d ",a[i][j]); } printf("\n"); } return; } void main() { int **a,**b,r1,c1,r2,c2,i,j,**product; printf("Enter the number of rows and columns in first matrix\n"); scanf("%d%d",&r1,&c1); printf("Enter the number of rows and columns in first matrix\n"); scanf("%d%d",&r2,&c2); if(r2==c1) { printf("Enter First array\n"); dynamic(&a,r1,c1); input(a,r1,c1); printf("Enter Second array\n"); dynamic(&b,r2,c2); input(b,r2,c2); printf("First matrix is\n"); print_array(a,r1,c1); printf("Second matrix is\n"); print_array(b,r2,c2); dynamic(&product,r1,c2); { if(product[0]==NULL) { printf("memory not allocated\n"); } } product=matmul(a,r1,c1,b,r2,c2,product); printf("Product of 2 matrices are\n"); print_array(product,r1,c2); freeing(a,r1,c1); freeing(b,r2,c2); freeing(product,r1,c2); } else { printf("Array multiplication not possible! enter correct dimension"); } } 我尝试编写一个用于动态分配二维数组的函数,但没有获取输入值,我将二维数组的地址传递给动态函数,这次它成功了。我对 add 函数应用了相同的逻辑,但我没有得到正确的结果,当我直接传递二维数组时它起作用了,这可能是什么原因。我还希望数组的维度由用户定义。 调用这两个递归函数的结果没有区别 然而,这些函数有一个严重的缺点:如果调用多次,它们将无法工作,因为静态变量 i 的值在函数调用后不会重置为 0。 也没有什么意义声明参数sum喜欢 int **sum 因为函数不会改变用作参数的指针本身。它更改指针指向的数据。 使用您的方法,可以按照下面的演示程序中所示的方式定义递归函数。该函数被调用两次以确保在第一次调用该函数后其静态变量被正确重置并且该函数可以被第二次调用。 在程序中没有使用动态分配的数组来简化代码。 #include <stdio.h> void add( int **a, int **b, unsigned int r, unsigned int c, int **sum ) { static unsigned int i = 0, j = 0; if (i < r && j != c) { sum[i][j] = a[i][j] + b[i][j]; if (++j == c) { j = 0; ++i; } add( a, b, r, c, sum ); } else { i = 0; } } int main( void ) { enum { r = 2, c = 3 }; int a0[c] = { 1, 2, 3 }; int a1[c] = { 4, 5, 6 }; int * aa[r] = { a0, a1 }; int ** a = aa; int b0[c] = { 10, 20, 30 }; int b1[c] = { 40, 50, 60 }; int * bb[r] = { b0, b1 }; int ** b = bb; int s0[c]; int s1[c]; int * ss[r] = { s0, s1 }; int ** sum = ss; add( a, b, r, c, sum ); for (unsigned int i = 0; i < r; i++) { for (unsigned int j = 0; j < c; j++) { printf( "%d ", sum[i][j] ); } putchar( '\n' ); } putchar( '\n' ); for (unsigned int j = 0; j < c; j++) { s0[j] = 0; s1[j] = 0; } add( a, b, r, c, sum ); for (unsigned int i = 0; i < r; i++) { for (unsigned int j = 0; j < c; j++) { printf( "%d ", sum[i][j] ); } putchar( '\n' ); } } 程序输出为 11 22 33 44 55 66 11 22 33 44 55 66 可以看出,该函数每次调用时都能正常工作。 函数的参数 r 和 c 具有无符号整数类型 unsigned int 而不是 int 因为将它们声明为具有符号整数类型是没有意义的。虽然一般来说,而不是类型 unsigned int 使用类型 size_t 会更好。 此时: (*sum)[i][j] = a[i][j]+b[i][j]; 编译器不知道数组的维数,因为函数: void add(int **a,int **b,int r,int c,int ***sum) 没有提供此类信息,换句话说,指向指针的指针和二维数组的类型不同,您不能期望编译器从 int(*)[dim] 中推断出 int [][dim] 或 int ** 从 C99 开始,您可以使用 VLA(可变长度数组)来解决这个问题: #include <stdio.h> #include <stdlib.h> #include <time.h> void add(int rows, int cols, int (*a)[cols], int (*b)[cols], int (*sum)[cols]) { for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { sum[row][col] = a[row][col] + b[row][col]; } } } int main(void) { int rows = 2, cols = 3; int ( *a )[cols] = malloc(sizeof(int) * rows * cols); int ( *b )[cols] = malloc(sizeof(int) * rows * cols); int (*sum)[cols] = malloc(sizeof(int) * rows * cols); srand((unsigned)time(NULL)); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { a[row][col] = rand() % 100; b[row][col] = rand() % 100; } } add(rows, cols, a, b, sum); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { printf("%d + %d = %d, ", a[row][col], b[row][col], sum[row][col]); } printf("\n"); } free(a); free(b); free(sum); return 0; } 注意 VLA 在 C11 中是可选的
如何在 C 或 C++ 中以 O(1) 时间复杂度交换两个字符串?
我想交换两个字符串而不复制所有字符,因为这需要更多时间。我认为使用字符串地址可以在 O(1) 时间复杂度内完成。但我无法弄清楚...
我遇到这个错误! “错误 CS0165 使用未分配的局部变量‘x’” 使用该内存位置添加到 100
我必须分叉一些孩子,并在他们分叉出一组称为 PCB 的结构时跟踪一些值。我使用了一个名为 forker 的函数来分叉子进程,在它里面是
我正在使用 Delphi 10 Seattle 开发一个 VCL 应用程序,当我注意到 Delphi 为 Rect 参数添加了一个 Ref 自定义属性时,我通过 IDE 创建了一个 TDBGrid 事件处理程序: 程序 Tf...
在尝试手动解决时,我无法理解如何获取以下 C++ 代码输出的正确值。 #包括 使用命名空间标准; int f(int a, ...
我在一个类里面有一些对类成员进行操作的函数。这些函数除了操作的类成员外,几乎完全相同。为了避免打出函数......
在这种特殊情况下,Javascript会发生什么(通过共享调用)?
Javascript使用了Call by Sharing,但我有个问题与React中的一些东西有关。当你在一个函数中设置一个状态(setState Hook或Class State)会发生什么? 例如:const [myState,...。
我发现delegate的行为就像值类型,但我想把它们作为引用类型使用。有什么方法比直接在delegate上封装一个类来让它表现为引用类型更好吗?首先,...
从'std::string*{aka std::string*& {aka std:::basic_string<char>*&}'类型的r值初始化无效的非const引用。
我正试图解决这个问题,我必须拼数字。当我试图通过引用调用我的字符串数组a时,我得到这个错误。但是如果我用值来调用它,我没有得到任何错误。我不知道哪里 ...
从CC++到C#的参数类型转换。"double*"转换为 "out double"?
我需要将一堆函数从C++转换为C#。这些函数有一些方法声明,比如void foo(struct input data*, double* ret1, double *ret2) { / 如果ret1不是NULL,返回一些东西在......
int main() { / 完成程序 string a,b; getline(cin,a); getline(cin,b); cout<
int main() { / 完成程序 string a,b; getline(cin,a); getline(cin,b); cout<
在回调函数中访问指定的变量名 - Node.js Express
使用Node.js和Express.Application.Listen方法。当我调用Application.listen方法时,我可以在回调函数中通过名字来访问返回的服务器对象,我把它作为一个参数传递给Application.listen... ...
假设我有一个Language类和一个Director类。 class Language { private: std::string name; Director director; public: Language(std::string name); std::string getName() { ...
#include 使用命名空间 std; 结构 x{ 向量 y; }; void magic(struct x& d) { d.y[0] = 5; } int main() { struct x d; d.y = {1,2,3}; struct x*...。
什么时候通过引用在另一个lambda中捕获一个lambda是安全的?
假设你有下面的程序: static std::function pack_a_lambda( std::function)。 to_be_packed ) { return [=]( int value ) { return to_be_packed( ...。
我想有一个较大的值类型的列表(如向量或矩阵),并希望通过引用访问它们,像这样: collection[index].X = newvalue; 或 ref Vector v = collection[index]; v.X = ....
class A { public $o; function __construct(&$o) { $this->o = $o; } function set($v) { $this->o["foo"] = $v; }。} $o = ["hello" => "world"]; $a = new A($o); $a->set(1); ...