文章目录基本语法效果演示函数引用传参普通传参值传递引用传参地址传递、修改原变量效果展示核心机制底层本质指针与引用的比较C语言指针写法繁琐C 引用写法简洁注意易错点错误1引用不初始化错误2绑定常量错误3更改引用指向不能改嫁基本语法int a 10; int b a; // b 是 a 的引用别名定义引用必须初始化不能单独写 int b;变量名 a、b 随便起和原变量名不需要一致效果演示int a 10; int b a; b 999; // a 也会变成 999函数引用传参普通传参值传递void test(int x){ x 1024; } // 外部变量不会变原理函数内是副本修改的是复制出来的新变量和外部无关。引用传参地址传递、修改原变量void test(int x){ x 1024; } // 外部实参直接被修改效果展示#includestdio.h void test (int x){ x 1024; printf(test函数内部的x值%d \n,x); // 1 } int main (){ int x 1; printf(调用函数前x的值%d \n,x); // 1024 test(x); printf(调用函数后x的值%d \n,x); // 1 }理解main 中的 x 在内存有一块空间调用 test 时test 里的 x 只是这块空间的另一个名字操作同一个内存格子。核心机制引用是“变量的别名。如int x中的在这里是类型修饰符而不是取地址运算符。语义声明x是某个已存在整型变量的别名。此后对x的任何操作都直接等同于对原变量的操作。底层本质在汇编/机器码层面引用在底层完全是指针的实现。它们都传递地址都只占 8 字节64位系统。唯一的区别在于语法糖特征C 语言指针 int *pC 引用 int r底层实现存储变量的地址存储变量的地址完全一样初始化可以不初始化野指针风险必须初始化且绑定后不可更改解引用必须显式使用 *p 来取值/赋值编译器自动解引用直接写 r 即可能否为 NULL可以p NULL不可以能否能重新指向可以p other不可以绑定后只能指向同一个变量void swap_ref(int a, int b) { // 形参是引用 int temp a; // 直接使用 a相当于 *a但不用写 * a b; // 直接修改实参 b temp; } // 调用swap_ref(x, y); // 直接传变量不需要 取地址指针与引用的比较功能完全等价都能修改外部原变量C语言指针写法繁琐voidtest(int*x){*x1024;}// 调用必须传地址test(num);C 引用写法简洁void test(int x){ x 1024; } // 调用直接传变量 test(num);注意形参名和实参名必须一样吗结论完全不需要一致引用绑定的是内存地址不是变量名字。记忆别名只是外号外号和本名不需要相同。指针形参 *x调用 变量内部 *x 解引用引用形参x调用直接写变量内部直接用易错点错误1引用不初始化int a; // 非法错误2绑定常量int a 10; // 非法错误3更改引用指向不能改嫁a b; // 这是赋值不是更换引用指向
C++中的引用语法
文章目录基本语法效果演示函数引用传参普通传参值传递引用传参地址传递、修改原变量效果展示核心机制底层本质指针与引用的比较C语言指针写法繁琐C 引用写法简洁注意易错点错误1引用不初始化错误2绑定常量错误3更改引用指向不能改嫁基本语法int a 10; int b a; // b 是 a 的引用别名定义引用必须初始化不能单独写 int b;变量名 a、b 随便起和原变量名不需要一致效果演示int a 10; int b a; b 999; // a 也会变成 999函数引用传参普通传参值传递void test(int x){ x 1024; } // 外部变量不会变原理函数内是副本修改的是复制出来的新变量和外部无关。引用传参地址传递、修改原变量void test(int x){ x 1024; } // 外部实参直接被修改效果展示#includestdio.h void test (int x){ x 1024; printf(test函数内部的x值%d \n,x); // 1 } int main (){ int x 1; printf(调用函数前x的值%d \n,x); // 1024 test(x); printf(调用函数后x的值%d \n,x); // 1 }理解main 中的 x 在内存有一块空间调用 test 时test 里的 x 只是这块空间的另一个名字操作同一个内存格子。核心机制引用是“变量的别名。如int x中的在这里是类型修饰符而不是取地址运算符。语义声明x是某个已存在整型变量的别名。此后对x的任何操作都直接等同于对原变量的操作。底层本质在汇编/机器码层面引用在底层完全是指针的实现。它们都传递地址都只占 8 字节64位系统。唯一的区别在于语法糖特征C 语言指针 int *pC 引用 int r底层实现存储变量的地址存储变量的地址完全一样初始化可以不初始化野指针风险必须初始化且绑定后不可更改解引用必须显式使用 *p 来取值/赋值编译器自动解引用直接写 r 即可能否为 NULL可以p NULL不可以能否能重新指向可以p other不可以绑定后只能指向同一个变量void swap_ref(int a, int b) { // 形参是引用 int temp a; // 直接使用 a相当于 *a但不用写 * a b; // 直接修改实参 b temp; } // 调用swap_ref(x, y); // 直接传变量不需要 取地址指针与引用的比较功能完全等价都能修改外部原变量C语言指针写法繁琐voidtest(int*x){*x1024;}// 调用必须传地址test(num);C 引用写法简洁void test(int x){ x 1024; } // 调用直接传变量 test(num);注意形参名和实参名必须一样吗结论完全不需要一致引用绑定的是内存地址不是变量名字。记忆别名只是外号外号和本名不需要相同。指针形参 *x调用 变量内部 *x 解引用引用形参x调用直接写变量内部直接用易错点错误1引用不初始化int a; // 非法错误2绑定常量int a 10; // 非法错误3更改引用指向不能改嫁a b; // 这是赋值不是更换引用指向