【问题标题】:C: Are arrays that are passed into a function creating a copy of the array or is it modifying the original array [duplicate]C:传递给函数的数组是创建数组的副本还是修改原始数组[重复]
【发布时间】:2017-02-01 23:19:14
【问题描述】:

当我将数组作为 C 函数中的参数传递时,它是创建数组的副本还是实际上对原始数组进行了更改?我在这里有一个小程序,可以将数字转换为二进制形式。例如,如果数字是 15,则二进制形式为 1111。

void convertToBinary(int base10, int result, char *binaryResult){
    int binaryVals[8] = {1,2,4,8,16,32,64,128};
    if(base10 == 0){ 
        printf("Binary Result %s", binaryResult);
    }   
    else{
        int max = 0;
        for(int i = 0; i < 8; i++){
            if(binaryVals[i] <= base10){
                binaryResult[i] = '0';
            }   
            else{
                max = binaryVals[i-1];
                binaryResult[i-1] = '1';
                result = base10-max;
                printf("Result %d", result);
                break;
                //convertToBinary(result,0, binaryResult);
            }   
        }   
    }   
}
int main(void){
   char binaryResult[8];
   convertToBinary(15,0,binaryResult);
}

递归部分让我失望了。我不确定为什么。我怀疑这是因为它每次运行递归时都会创建数组的副本。但我不知道如何解决这个问题。如果有人能帮忙就太好了,谢谢

【问题讨论】:

  • 所以如果我将一个数组传递给一个参数,它正在制作一个数组的副本,但我仍然不完全明白如何修改原始数组。我仍然对 malloc 的东西以及如何应用它感到困惑。
  • @J_LIU 呃,你显然误解了这两个链接。数组永远不会被复制。从您的函数签名中可以看出,它将数组作为 pointer 指向其第一个元素。
  • C不支持artsy类型的参数。

标签: c


【解决方案1】:

传递给函数的数组总是修改原始数组。函数声明:

void func( int* array);
void func( int array[]);

是等价的,因为当您使用数组参数调用这些函数时,数组衰减 成为两者的指针。因为传递的是指针,实际上是通过引用传递数组,并且修改了原始数组。

【讨论】:

  • Nit:数组只在第二种情况下衰减为指针;在第一种情况下,根本没有数组。但重点仍然存在。
  • @ravron:两个声明是等价的。使第二个声明等同于第一个声明的过程并未正式称为“数组类型衰减”。 “数组类型衰减”是 表达式 中数组 objects 发生的情况。以上是声明,不是表达式。
  • 严格来说:你传递给函数的不是一个数组,而是一个指向它的第一个元素的指针。这就是sizeof(array) 产生指向int 的指针大小的原因。对于两种文本变体。从语义上讲,它们不仅是等价的,而且是相同的。
  • @AnT:我的意思是当一个函数被用作第二个函数的参数时,数组会衰减为一个指针。但你们都是对的。
  • @Olaf:在这个例子中——是的。然而,在一般情况下,适用于数组声明的正常规则仍然完全适用于第二个变体。您将无法在第二个变体中使用不完整的元素类型(在第一个变体中可以),您将无法指定零或负数组大小(即使它被忽略)。在这方面它们是不等价的。
猜你喜欢
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多