c - 传递地址,但它的工作方式就像 C 中的值调用?

标签 c pointers call-by-value

您好,我是 C 编程语言的初学者。最近我读到了按值调用和按地址调用。我了解到,在按地址调用中,被调用函数的变化反射(reflect)了被调用者。然而下面的代码却不能这样工作。

int x = 10,y = 20;
void change_by_add(int *ptr) {
    ptr = &y;
    printf("\n Inside change_by_add\t %d",*ptr);
    // here *ptr is printing 20
}

void main(){
    int *p;
    p = &x;
    change_by_add(p);
    printf("\nInside main\t %d", *p);
    // here *p is still pointing to address of x and printing 10
}

当我传递地址时,为什么被调用函数所做的更改不反射(reflect)调用者?

最佳答案

该函数正在为指针分配一个新地址,但指针本身是按值传递的,因为所有参数都在 C 中。要更改指针变量的值,必须传递指针本身的地址:

void change_by_add(int **ptr)
{
    *ptr = &y;
}

change_by_add(&p);

参见C FAQ Question 4.8 .

C 中不存在引用传递,但可以通过将要更改值的变量的地址传递给函数来实现。例如:

void add_to_int(int* a_value, int a_increment)
{
    *a_value += a_increment;
}

关于c - 传递地址,但它的工作方式就像 C 中的值调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24142432/

相关文章:

c++ - Ncurses:面板的 doupdate() 和 refresh() 之间的区别

c - 在 Nginx 中使用 C 处理 HTTP 请求

c++ - 没有运算符 ">>"匹配这些操作数 操作数类型是:std::istream >> double*

c++ - 如何将字符串文字传递给用 C++ 处理的函数?

使用 c 中的 memcpy 将多个结构复制到缓冲区中

c - 当我无法进入函数时这意味着什么? [C]

c - 为什么 'address of' 运算符给我的指针地址与指针本身不同?

c - C 中的简单指针问题 - 错误值

c++ - 为什么在 C++ 中使用按值调用?

java - 为什么修改了 ArrayList 参数,但没有修改 String 参数?