C语言中值传递、指针传递和引用传递
这篇文章发布已经超过两年,部分工具、版本或观点可能已经变化,请结合最新信息判断。
2022年我才搞懂这个!
比较
| 传递方式 | 函数定义 | 函数调用 | 函数内对a修改的影响 |
|---|---|---|---|
| 值传递 | fun(int a) | fun(x) | 外部x不变 |
| 指针传递 | fun(int *a) | fun(&x) | 外部x同步更改 |
| 引用传递 | fun(int &a) | fun(x) | 外部x同步更改 |
值传递
值传递是最常用的一种方式。它就是从函数外拷贝到函数内。
指针传递
指针传递跟值传递其实差不多,只是传递的内容从一个值换成了指针。定义函数的时候要写成fun(int *a),函数内的a就是一个int类型指针要使用a对象的话就得写成*a。
在函数外如果定义一个int b=1,想把它传到函数里的话需要用到取地址符&,像这样写fun(&b)。
示例:
#include <stdio.h>
void swap(int *a, int *b){
printf("swap enter\n");
printf("a = %d, ptr = %p\n", *a, a);
printf("b = %d, ptr = %p\n", *a, b);
int tmp = *b;
*b = *a;
*a = tmp;
printf("a = %d, ptr = %p\n", *a, a);
printf("b = %d, ptr = %p\n", *b, b);
printf("swap leave\n");
}
int main() {
int x = 1;
int y = 2;
printf("x = %d, ptr = %p\n", x, &x);
printf("y = %d, ptr = %p\n", y, &y);
swap(&x, &y);
printf("x = %d, ptr = %p\n", x, &x);
printf("y = %d, ptr = %p\n", y, &y);
return 0;
}
结果:
x = 1, ptr = 000000000022FE4C
y = 2, ptr = 000000000022FE48
swap enter
a = 1, ptr = 000000000022FE4C
b = 1, ptr = 000000000022FE48
a = 2, ptr = 000000000022FE4C
b = 1, ptr = 000000000022FE48
swap leave
x = 2, ptr = 000000000022FE4C
y = 1, ptr = 000000000022FE48
引用传递
在定义的时候形参前要加一个&,这个不是取地址符,而是一个记号。(这就是c语言贼tm绕人的地方qwq)比如int fun(int &a)。
调用函数时参数前不需要加任何记号,比如int a=10,fun(a)。
在函数内使用的时候不用加任何东西,直接用即可,比如a=20。
函数内和函数外a的值会同步改变。
示例:
class Solution {
public:
void preorder(TreeNode *root, vector<int> &res){ //这里res前要加一个&
if (root == nullptr){
return;
}
res.push_back(root->val);
preorder(root->left, res); // res可以直接访问到对象内容,且函数内外指向同一个对象
preorder(root->right, res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res; //创建res对象
preorder(root, res);
return res;
}
};
参考资料
以上我自己的总结是非常简单的,仅能保证我在做题时看懂题解,但其实这里面还有很多细节没提到。学到现在终于能体会到当年为什么老师说c语言的指针很难了。
参考csdn文章:http://t.csdn.cn/suCK6
评论区已延迟加载滑到评论区附近时会自动加载,也可以现在手动打开。



