当C传递值时,我的数组如何被修改?

时间:2017-08-23 19:14:20

标签: c

我在C中制作了一个简单的程序来检查两个单词是否是字谜。我的问题是,如果我将word_one和word_two作为参数传递,那是不是意味着我没有修改原始数组?我认为我有效地处理了这些未归还的副本。

这意味着我不能将它们与我的equal_array函数进行比较。

function getLocationForName(address, callback){
      getJson(geoCodeUrl+address+apiKey).then(function(location){
        if (callback) callback(location.results[0].geometry.location); 
      });
}
someFunc(){
    getLocationForName(city+f['street']+'+'+f['house'], function(location){
       f['location'] = location;
    });
}

4 个答案:

答案 0 :(得分:6)

C确实总是按值传递,但是当数组传递给函数时,即使在参数声明中指定了长度,它们总是衰减为指针。你的宣言

会发生什么
void read_word(int counts[26])

相当于

void read_word(int * counts)

当您将word_oneword_two传递给函数时,它们接收的值是数组的第一个元素的地址。这些仍然指向原始数组,因此,当您在函数中修改它们时,结果也会在原始数组中可见。

<强> ADDIT

有趣但鲜为人知的旁注:在C99及更高版本中,您可以使用static前面的长度声明您的函数,如下所示:

void read_word(int counts[static 26])

这并没有改变函数接收地址副本而不是整个数组的事实,但它确实允许编译器优化和检测潜在的错误。对于上面的read_word,编译器可以发出警告,如果您传递NULL - 指向函数的指针,或者传递少于26个元素的数组。更多内容可以阅读here

答案 1 :(得分:4)

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则表达式为类型“{元素数组T”将被转换(“衰减”)为“指向T的指针”类型的表达式,表达式的值将是第一个元素的地址数组。

致电时

read_word(word_one); 

表达式 word_one从“int的26个元素数组”转换为“指向int的指针”,所以实际传递到read_wordword_one的第一个元素的地址

在函数参数声明的上下文中,T a[N]T a[]都被解释为T *a - a被声明为指向T的指针,不是T的数组。因此,原型

void read_word(int counts[26])

被解释为

void read_word(int *counts)

因此,read_word确实会修改word_oneword_two的内容。

您需要将数组的大小作为单独的参数传递:

read_word( word_one, sizeof word_one );
...
void read_word( int *counts, size_t size )
{
  ...
}

因为您不会仅仅从指针知道目标数组的大小。

答案 2 :(得分:1)

数组是C中的引用类型。如果一个函数接受一个数组,它将传递一个指针,你对它做的任何更改也会影响原始数组。

答案 3 :(得分:-2)

C只传递指针。只有结构和简单类型由值传递。