C 中的参数传递 - 指针、地址、别名
Parameter Passing in C - Pointers, Addresses, Aliases
有人可以解释一下 C 中参数传递的区别吗?
根据教授的笔记,有4种不同的方式来传递参数
- 按值调用
- 按地址调用(指针)
- 别名调用
- 全局变量/静态变量
如果你能举个例子,我将不胜感激,你的工作将受到赞扬。
按值调用
将值作为参数传递给函数。如果函数修改变量,实际变量不会改变。
void fun1(int myParam)
{
myParam = 4;
}
void main()
{
int myValue = 2;
fun1(myValue);
printf("myValue = %d",myValue);
}
myValue
永远是 2.
按地址调用(指针)
void fun1(int *myParam)
{
*myParam = 4;
}
void main()
{
int myValue = 2;
fun1(&myValue);
printf("myValue = %d",myValue);
}
这里我们将 myValue
的地址传递给 fun1
。所以 myValue
的值在 main()
.
的末尾将是 4
别名调用
据我了解,C 中没有别名。应该是C++的引用机制。
全局变量/静态变量
全局变量和静态变量是存储在公共位置的变量,可供调用者和被调用者函数访问。因此调用者和被调用者都可以访问和修改它们。
int myValue = 2;
void fun1()
{
myValue = 4;
}
void main()
{
myValue = 2
fun1();
printf("myValue = %d",myValue);
}
如你所料,myValue
的值在main()
的最后会是4。
希望对您有所帮助。
C按值、句点传递所有函数参数;形式参数(在定义中)是内存中与实际参数(在调用中)分开的对象。对形式参数的任何更新都不会影响实际参数。您可以使用指针伪造按引用传递语义,但指针是按值传递的。
真正的按引用传递意味着形参和实参引用内存中的同一个对象,因此对形参的任何更改也会影响实参。实际上,一个类似指针的对象被传递给子例程,但这对程序员是隐藏的。
C 不支持按引用传递。 C++ 支持使用特殊运算符的按引用传递。老式 Fortran 是通过引用传递的。
全局变量对调用者和被调用者都是可见的。
无法与传递名称或传递别名通话;从未使用过使用该机制的语言。
有人可以解释一下 C 中参数传递的区别吗? 根据教授的笔记,有4种不同的方式来传递参数
- 按值调用
- 按地址调用(指针)
- 别名调用
- 全局变量/静态变量
如果你能举个例子,我将不胜感激,你的工作将受到赞扬。
按值调用
将值作为参数传递给函数。如果函数修改变量,实际变量不会改变。
void fun1(int myParam) { myParam = 4; } void main() { int myValue = 2; fun1(myValue); printf("myValue = %d",myValue); }
myValue
永远是 2.按地址调用(指针)
void fun1(int *myParam) { *myParam = 4; } void main() { int myValue = 2; fun1(&myValue); printf("myValue = %d",myValue); }
这里我们将
myValue
的地址传递给fun1
。所以myValue
的值在main()
. 的末尾将是 4
别名调用
据我了解,C 中没有别名。应该是C++的引用机制。
全局变量/静态变量
全局变量和静态变量是存储在公共位置的变量,可供调用者和被调用者函数访问。因此调用者和被调用者都可以访问和修改它们。
int myValue = 2; void fun1() { myValue = 4; } void main() { myValue = 2 fun1(); printf("myValue = %d",myValue); }
如你所料,
myValue
的值在main()
的最后会是4。
希望对您有所帮助。
C按值、句点传递所有函数参数;形式参数(在定义中)是内存中与实际参数(在调用中)分开的对象。对形式参数的任何更新都不会影响实际参数。您可以使用指针伪造按引用传递语义,但指针是按值传递的。
真正的按引用传递意味着形参和实参引用内存中的同一个对象,因此对形参的任何更改也会影响实参。实际上,一个类似指针的对象被传递给子例程,但这对程序员是隐藏的。
C 不支持按引用传递。 C++ 支持使用特殊运算符的按引用传递。老式 Fortran 是通过引用传递的。
全局变量对调用者和被调用者都是可见的。
无法与传递名称或传递别名通话;从未使用过使用该机制的语言。