我在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;
});
}
答案 0 :(得分:6)
C确实总是按值传递,但是当数组传递给函数时,即使在参数声明中指定了长度,它们总是衰减为指针。你的宣言
会发生什么void read_word(int counts[26])
相当于
void read_word(int * counts)
当您将word_one
和word_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_word
是word_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_one
和word_two
的内容。
您需要将数组的大小作为单独的参数传递:
read_word( word_one, sizeof word_one );
...
void read_word( int *counts, size_t size )
{
...
}
因为您不会仅仅从指针知道目标数组的大小。
答案 2 :(得分:1)
数组是C中的引用类型。如果一个函数接受一个数组,它将传递一个指针,你对它做的任何更改也会影响原始数组。
答案 3 :(得分:-2)
C只传递指针。只有结构和简单类型由值传递。