gpt4 book ai didi

c - 在 C 中通过引用传递数组

转载 作者:太空狗 更新时间:2023-10-29 16:29:39 25 4
gpt4 key购买 nike

我是 C 的新手,我有疑问。

由于 C 函数创建其参数的本地副本,我想知道为什么以下代码会按预期工作:

void function(int array[]){

array[0] = 4;
array[1] = 5;
array[2] = 6;
}

int main(){

int array[] = {1,2,3};

function(array);

printf("%d %d %d",array[0],array[1],array[2]);

return 0;
}

线路输出为 4 5 6.

为什么这个有效而以下无效?

void function(int integer){

integer = 2;
}

int main(){

int integer = 1;

function(integer);

printf("%d",integer);

return 0;
}

在这种情况下,输出仅为 1。

简短版本:如果函数作为数组传递,为什么函数可以修改其父变量的值?

谢谢大家!

最佳答案

这是因为数组往往会退化为指针。

int a[] = { 1, 2, 3 };
int* p = a; // valid: p is now the address of a[0]
a = p; // NOT valid.

printf("a = %p\n", a);
printf("p = %p\n", p); // prints same address as a

ap 将打印相同的值。

与其他人所说的相反,a 不是 指针,它可以简单地衰减为 1。 http://c-faq.com/aryptr/aryptrequiv.html

在您的第一个 function() 中,传递的是数组第一个元素的地址,并且函数体取消引用它。事实上,编译器是这样处理函数原型(prototype)的:

void function(int* array /*you wrote int array[]*/){
array[0] = 4;
array[1] = 5;
array[2] = 6;
}

function(&array[0]);

这一定会发生,因为您说的是“大小未知的数组”(int array[])。编译器无法保证推断出按值传递所需的堆栈数量,因此它会衰减为指针。

---- 编辑----

让我们结合您的示例并使用更独特的名称以使事情更清楚。

#include <stdio.h>

void func1(int dynArray[]) {
printf("func1: dynArray = %p, &dynArray[0] = %p, dynArray[0] = %d\n",
dynArray, &dynArray[0], dynArray[0]);
}

void func2(int* intPtr) {
printf("func2: intPtr = %p, &intPtr[0] = %p, intPtr[0] = %d\n",
intPtr, &intPtr[0], intPtr[0]);
}

void func3(int intVal) {
printf("func3: intVal = %d, &intValue = %p\n",
intVal, &intVal);
}

int main() {
int mainArray[3] = { 1, 2, 3 };
int mainInt = 10;

printf("mainArray = %p, &mainArray[0] = %p, mainArray[0] = %d\n",
mainArray, &mainArray, mainArray[0]);
func1(mainArray);
func2(mainArray);

printf("mainInt = %d, &mainInt = %p\n",
mainInt, &mainInt);
func3(mainInt);

return 0;
}

ideone 现场演示:http://ideone.com/P8C1f4

mainArray = 0xbf806ad4, &mainArray[0] = 0xbf806ad4, mainArray[0] = 1
func1: dynArray = 0xbf806ad4, &dynArray[0] = 0xbf806ad4, dynArray[0] = 1
func2: intPtr = 0xbf806ad4, &intPtr[0] = 0xbf806ad4, intPtr[0] = 1

mainInt = 10, &mainInt = 0xbf806acc
func3: intVal = 10, &intValue = 0xbf806ad0

func1func2 中,“dynArray”和“intPtr”是局部变量,但它们是指针变量,它们从main 接收“mainArray”的地址。

此行为特定于数组。如果将数组放在结构中,则可以按值传递它。

关于c - 在 C 中通过引用传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com