pass-by-reference 相关问题

通过引用传递是一种参数编组策略,其中变量在内存中的位置传递给函数,而不是变量值的副本,尽管函数出现在源代码中以接收变量本身而不是指向它的指针。

通过引用传递值是线程安全的吗?

我有以下代码: #包括 无效 foo(int&){} int main() { 整数值 = 42; std::thread t1([&value]{ foo(value); }); std::thread t2([&value]{ value = 100500;...

回答 1 投票 0

C 程序调用 malloc 导致总线错误?

我编写了这段代码来声明一个指针p,然后为int类型动态分配4个字节的内存,然后在其中存储一些数据。 p 应该指向一个保存数据 6 的地址...

回答 3 投票 0

DataFrame 列按引用子集

我有一个带有两个 UInt32 列的 DataFrame x。以下函数在第二列的子集中搜索第一列的值: findfirst(==(x[y, 1]), x[1:(y - 1), 2]) 你是个骗子...

回答 1 投票 0

为什么下面程序的输出是这样的? [重复]

考虑下面的程序 A类{ 公共无效 foo0(){ ArrayList tmp = new ArrayList<>(); tmp.add(1); System.out.println(tmp.size());

回答 2 投票 0

如何将 VBA 类变量传递给模块函数 ByRef?

VBA 类对象可以传递给模块函数,然后函数可以修改类对象的变量。 但是,我找不到一种方法来传递单个类变量来做同样的事情......

回答 0 投票 0

当通过 TypeBuilder.CreateType 实现具有带有“in”参数的方法的接口时,抛出 TypeLoadException

使用 TypeBuilder,我正在构建一个实现包含方法的接口的类。在使用 ILGenerator 实现该方法后,我调用 TypeBuilder.CreateType() 并且一切正常......

回答 1 投票 0

java中的数组是按引用传递还是按值传递?

Java中的数组是按引用传递还是按值传递? 假设我有一个名为 data 的数组,其中包含某种类型的对象。现在让我们假设我将该数组传递并存储在类 A 和...

回答 4 投票 0

多个列表共享相同的引用

我有一个名为 allAppointmentList 的函数,可以使用 AppointmentProvider 类中的 GET 方法从服务器获取约会。 在我的 MyAppointments 类中,我初始化了 2 个名为 appoi 的列表...

回答 3 投票 0

为什么函数可以接收一个字符数组作为字符指针,为什么函数可以改变元素的值?

我将 char 指针声明为函数的参数,并将 char 数组作为参数。 有人告诉我 char 指针和 char 数组是不同的类型。 但是函数可以有一个 char 数组作为...

回答 1 投票 0

如何使用函数查找数组的总和和平均值并通过引用调用 C++

我们被告知要编写一个函数,该函数接受一个双精度数组并传回数组中数字的总和和平均值 这是代码: #包括 #包括 ...

回答 1 投票 0

如何为基类引用传递的值创建一个 unique_ptr?

我有基类和派生类,我需要通过虚拟成员函数 foo() 从中获得多态行为: #包括 #包括 类基础{ 民众: 虚拟...

回答 2 投票 0

修改匿名函数内的全局变量

我在 PHP 中玩弄匿名函数,发现它们似乎无法访问外部变量。 有什么办法可以解决这个问题吗? 例子: $variable = "nothi...

回答 2 投票 0

如何在 C++ 中将变量从一个函数传递给另一个函数?

#include 常量双 pi{3.14}; 双半径() { std::cout << "What is the radius of your circle?\n"; double radius{}; std::cin >> 半径;

回答 1 投票 0

如何使用 std::pair 传递 const 引用?

我找到了一段代码如下: std::pair unpack_if_const(const ColumnPtr& ptr) noexcept { 如果 (is_column_const(*ptr)) { 返回 std::make_pair(

回答 1 投票 0

如果 JavaScript 对象通过引用传递,为什么更新属性值不更新局部变量[重复]

对象通过引用传递。它们永远不会被复制。 我有一个代码段如下: var person = { firstname: 'John', lastname: 'Smith' } var anotherPerson = 人 另一个人.ni...

回答 5 投票 0

函数调用中的堆栈分配

调用函数时,如果传递给函数的参数不是数组,或者不是故意使用与符号 (&) 的引用传递,则传递给函数的参数将按值传递。例如,

回答 0 投票 0

JavaScript 通过引用与通过值 [重复]

我正在寻找一些很好的综合阅读材料,了解 JavaScript 何时按值传递某些内容,何时按引用传递以及修改传递的项目何时影响函数外部的值以及...

回答 4 投票 0

如果内存已经分配,函数内数组中的更改是否会保留在主函数或调用函数中?

在此函数定义中,我采用了二维数组地址的参数。 无效动态(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 中是可选的

回答 2 投票 0

如何在 C 或 C++ 中以 O(1) 时间复杂度交换两个字符串?

我想交换两个字符串而不复制所有字符,因为这需要更多时间。我认为使用字符串地址可以在 O(1) 时间复杂度内完成。但我无法弄清楚...

回答 1 投票 0

为什么当我用一个没有值的变量值通过引用调用函数时会报错?

我遇到这个错误! “错误 CS0165 使用未分配的局部变量‘x’” 使用该内存位置添加到 100

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.