我知道当我们将参数传递给函数时,会在函数的堆栈中创建一个副本,并且调用者函数中参数的实际值没有变化。
将指针传递给函数时会发生什么?我知道参数的值在调用者函数中确实发生了变化。但它是如何在内部发生的?被调用函数如何访问调用者函数中的变量?
我试图从维基百科的Call_by_reference 页面获取信息,但并不重要。
一旦我开始阅读有关字符串并将字符串作为参数传递给其他函数的内容,我就会对此感到困惑。任何有关这方面的帮助都会有很大帮助。谢谢!!!!
我知道当我们将参数传递给函数时,会在函数的堆栈中创建一个副本,并且调用者函数中参数的实际值没有变化。
将指针传递给函数时会发生什么?我知道参数的值在调用者函数中确实发生了变化。但它是如何在内部发生的?被调用函数如何访问调用者函数中的变量?
我试图从维基百科的Call_by_reference 页面获取信息,但并不重要。
一旦我开始阅读有关字符串并将字符串作为参数传递给其他函数的内容,我就会对此感到困惑。任何有关这方面的帮助都会有很大帮助。谢谢!!!!
当您将指针传递给函数时,指针会被复制。但是,指向对象的指针的副本x
也是指向 的指针x
,因此可以使用它来修改x
。
对于(人为的)类比,假设那x
是你的房子。根据 C 的规则,当您需要管道工来修理房子里的东西时,您可以给管道工一份您房子的副本,让他们修理,然后将副本还给您。不用说,对于大于几个字节的房屋,由于所有的复制,这是非常低效的。所以相反,你给水管工一个指向你房子的指针(它的地址),这样水管工就可以进入你的房子并当场修理它。这就是引用调用的含义:您传递的不是要修改的数据,而是指向该数据的指针,以便被调用者知道在哪个位置进行操作,而不仅仅是在哪个 value 上进行操作。
const int broken = 0, fixed = 1;
struct House {
int plumbing;
};
void plumber(House *h)
{
h->plumbing = fixed;
}
int main()
{
struct House h;
h.plumbing = broken;
plumber(&h); // give the plumber the address of the house,
// not a copy of the house
assert(h.plumbing == fixed);
}
在传递字符串的情况下,您传递的是指向char
字符串中第一个的指针。使用指针算法,您可以得到以下元素。
C 没有通过引用传递。将指针传递给函数时,实际上是将变量的地址传递给函数。然后该函数可以更改该地址处的值,然后此更改将反映在调用函数的变量中。但是,如果您尝试更改指针指向的地址,则更改不会反映在调用函数中,因为指针仍然按值传递。
void f(int *j) {
(*j)++;
int k = 20;
j = &k;
}
int main() {
int i = 20;
int *p = &i;
printf("i = %d, p = %p\n", i, p);
f(p);
printf("i = %d, p = %p\n", i, p);
return 0;
}
输出
i = 20, p = 0x123456
i = 21, p = 0x123456
C 中的每个参数都是按值传递的。
a=10 b=20
------ -------
0xf8 0Xf4
---------- ---------
Suppose a and b are two variables in a function stack
when you call another function
foo(&a,&b)
actually 0xf8 and 0xf4 is caught in the definition of
foo(int *pa,int *pb)
So pa=0xf8 pb=0xf4
-------- ---------
But *pa = 10 and *pb = 20 , You can manipulate like this.
So these pointers start pointing to the actual data and any changes here are reflected in the original environment.
所有数据都存储在具有特定地址的特定位置。当你通过引用传递时,你通过引用传递数据的地址。并告诉函数使用间接寻址来操作数据。
当您将其传递给函数时,(变量的)地址作为数据发送,但数据本身是按值传递的。