2026/2/20 19:39:20
网站建设
项目流程
公司网站英文,手机网站比例,淘宝客手机网站搭建,wordpress博客位置一.指针和引用的概念
指针#xff1a;指针是一个变量#xff0c;其值为另一个变量的内存地址。我们可以通过指针来间接访问和修改它所指向的变量的值。
代码语言#xff1a;javascript
AI代码解释
int main() {int x 10;int* ptr x; // 指针ptr指向x的地址cout …一.指针和引用的概念指针指针是一个变量其值为另一个变量的内存地址。我们可以通过指针来间接访问和修改它所指向的变量的值。代码语言javascriptAI代码解释int main() { int x 10; int* ptr x; // 指针ptr指向x的地址 cout x的值: x endl; // 直接访问x cout x的地址: x endl; // 输出x的地址 cout ptr的值: ptr endl; // 输出ptr存储的地址即x的地址 cout ptr指向的值: *ptr endl; // 通过指针访问x的值 *ptr 20; // 通过指针修改x的值 cout 修改后x的值: x endl; return 0; }引用引用是已存在变量的别名它与被引用的变量共享同一内存地址。引用一旦初始化后就不能再指向其他变量。代码语言javascriptAI代码解释int main() { int x 10; int ref x; // ref是x的引用别名 cout x的值: x endl; cout ref的值: ref endl; cout x的地址: x endl; cout ref的地址: ref endl; // 与x的地址相同 ref 20; // 通过引用修改x的值 cout 修改后x的值: x endl; return 0; }二.指针与引用的核心区别1. 声明与初始化指针使用*声明可以不初始化但不推荐也可以初始化为nullptr代码语言javascriptAI代码解释int* ptr1; // 未初始化的指针危险 int* ptr2 nullptr; // 空指针 int x 5; int* ptr3 x; // 指向x的指针引用使用声明必须在创建时初始化且不能初始化为nullptr代码语言javascriptAI代码解释int x 5; int ref1 x; // 正确ref1是x的引用 // int ref2; // 错误引用必须初始化 // int ref3 nullptr; // 错误不能将引用初始化为空2. 可修改性指针可以改变指向的对象代码语言javascriptAI代码解释int x 5, y 10; int* ptr x; ptr y; // 指针现在指向y引用一旦绑定到某个对象就不能再绑定到其他对象代码语言javascriptAI代码解释int x 5, y 10; int ref x; ref y; // 这是将y的值赋给x而不是让ref引用y3. 空值指针可以为空nullptr表示不指向任何对象代码语言javascriptAI代码解释int* ptr nullptr; // 空指针引用不能为空必须始终引用一个有效的对象。不存在 空引用 的概念4. 内存占用指针需要占用内存空间来存储地址通常为 4 字节或 8 字节取决于系统引用在语法层面不占用内存空间它只是一个别名。编译器通常会使用指针来实现引用但这是编译器内部的事情对程序员是透明的。5. 操作符指针使用*运算符访问指向的对象使用-运算符访问指向对象的成员代码语言javascriptAI代码解释struct Person { string name; int age; }; Person p{Alice, 30}; Person* ptr p; cout ptr-name endl; // 使用-访问成员 cout (*ptr).age endl; // 先解引用再用.访问成员引用直接使用.运算符访问成员无需解引用代码语言javascriptAI代码解释Person p{Bob, 25}; Person ref p; cout ref.name endl; // 直接使用.访问成员6. 多级访问指针支持多级指针指针的指针代码语言javascriptAI代码解释int x 5; int* ptr x; int**ptr_ptr ptr; // 指向指针的指针 cout ** ptr_ptr endl; // 输出5引用不支持多级引用不存在 引用的引用三.指针与引用的共同点都可以间接访问和修改所指向 / 引用的变量都可以作为函数参数实现参数的 传址 效果允许函数修改实参的值都可以指向 / 引用堆上分配的内存何时使用指针何时使用引用使用引用的场景函数参数传递尤其是对于大型对象可以避免拷贝开销同时不希望参数为 null函数返回值当函数需要返回元素或对象成员的访问权时操作符重载如operator使语法更自然代码语言javascriptAI代码解释// 引用作为函数参数 void swap(int a, int b) { int temp a; a b; b temp; } // 引用作为函数返回值 vectorint vec {1, 2, 3}; int get_element(int index) { return vec[index]; // 返回向量元素的引用 }使用指针的场景需要表示 空 的情况可以使用nullptr需要改变指向的目标时处理动态分配的内存实现数据结构如链表、树等函数需要返回多个值时通过指针参数代码语言javascriptAI代码解释// 指针表示空值 int* find(int* arr, int size, int target) { for (int i 0; i size; i) { if (arr[i] target) { return arr[i]; } } return nullptr; // 未找到返回空指针 } // 动态内存分配 int* create_array(int size) { return new int[size]; // 返回指向新分配数组的指针 }指针和引用都是 C 中用于间接访问变量的重要工具它们各有特点和适用场景指针更灵活可以为空可以改变指向但使用不当容易引发错误引用更安全必须初始化且不能为 null语法更简洁但灵活性较低