做seo必须有自己网站吗,关键词排名 收录 查询,合肥快速建站模板,wordpress go跳转页#x1f31f; C指针与结构体超全指南 | 编程萌新必看#xff01;附代码运行效果#x1f4bb;
文末有总结表格学习心得❤️ 建议收藏#xff01; #x1f50d; 一、指针篇#xff1a;内存操作的魔法棒✨
1️⃣ 指针定义与使用
指针就是内存地址的导航仪 C指针与结构体超全指南 | 编程萌新必看附代码运行效果
文末有总结表格学习心得❤️ 建议收藏 一、指针篇内存操作的魔法棒✨
1️⃣ 指针定义与使用
指针就是内存地址的导航仪帮你精准定位数据位置
#include iostream
using namespace std;int main() {int num 42; // 普通变量int *p num; // p指向num的家地址cout num的值: num endl; // 42cout p指向的值: *p endl; // 42*p 100; // 通过指针改值cout 修改后num: num endl; // 100return 0;
}
运行结果
num的值: 42
p指向的值: 42
修改后num: 100 2️⃣ 指针内存空间
所有指针都是均码32位穿4码4字节64位穿8码8字节
cout int*尺寸: sizeof(int*) endl; // 4或8
cout double*尺寸: sizeof(double*) endl; // 相同
运行结果
int*尺寸: 8 // 64位系统
double*尺寸: 8 3️⃣ 空指针 vs 野指针
⚠️ 安全操作指南
类型特点正确姿势空指针安全无害的小透明int *p nullptr;野指针随时爆炸的炸弹初始化初始化初始化
int *safePtr nullptr; // ✅ 安全空指针
// *safePtr 10; // ❌ 禁止操作空指针if(safePtr ! nullptr) {cout *safePtr; // 安全操作
} 4️⃣ const修饰指针
三种保护模式任你选
int a 10, b 20;const int *p1 a; // ️ 保护数据不能改值
// *p1 30; // 禁止int * const p2 a; // 保护指针不能换地址
// p2 b; // 禁止const int * const p3 a; // 双重保护都不能动
// *p340; p3b; // 全禁止 5️⃣ 指针数组最佳CP
指针让数组操作飞起来✈️
int arr[5] {1,2,3,4,5};
int *p arr; // p指向数组首地址// 三种访问方式对比
cout 下标访问: arr[2] endl; // 3
cout 指针偏移: *(p2) endl; // 3
cout 数组名偏移: *(arr2) endl; // 3
运行结果
下标访问: 3
指针偏移: 3
数组名偏移: 3 6️⃣ 指针函数参数
告别值拷贝直改原始数据
void doubleValue(int *ptr) {*ptr * 2; // 直捣黄龙
}int main() {int num 5;doubleValue(num);cout 翻倍后: num; // 10
}
运行结果
翻倍后: 10 7️⃣ 综合案例指针操作数组
实现数组排序查找
#include iostream
using namespace std;// 指针版冒泡排序
void bubbleSort(int *arr, int size) {for(int i0; isize-1; i) {for(int *parr; parrsize-1-i; p) {if(*p *(p1)) {swap(*p, *(p1)); // 交换相邻元素}}}
}int main() {int nums[] {5,3,8,1,4};int len sizeof(nums)/sizeof(nums[0]);cout 排序前: ;for(int i0; ilen; i) cout nums[i] ;bubbleSort(nums, len);cout \n排序后: ;for(int i0; ilen; i) cout nums[i] ;
}
运行结果
排序前: 5 3 8 1 4
排序后: 1 3 4 5 8 二、结构体篇自定义数据容器
1️⃣ 结构体定义与使用
打造专属数据模板
struct Student {string name;int age;float score;
};int main() {// 创建结构体变量Student s1;s1.name 小明;s1.age 18;s1.score 92.5f;// 初始化写法Student s2 {小红, 17, 88.5};cout s1.name 的成绩 s1.score endl;
}
运行结果
小明的成绩92.5 2️⃣ 结构体数组
批量管理神器
struct Book {string title;string author;float price;
};int main() {Book library[3] {{C Primer, Stanley, 99.9},{Effective C, Scott, 89.5},{Clean Code, Robert, 79.8}};cout 第二本书: library[1].title; // Effective C
}
运行结果
第二本书: Effective C 3️⃣ 结构体指针
高效访问技巧⚡
Student s {小刚, 20, 95.0};
Student *ptr s;cout ptr-name; // 小刚等价于(*ptr).name
ptr-score 98.5; // 修改成绩 4️⃣ 结构体嵌套
俄罗斯套娃式设计
struct Address {string city;string street;int number;
};struct User {string name;Address addr; // 嵌套结构体
};int main() {User u {小美, {上海, 南京路, 1024}};cout u.name 住在 u.addr.city;
}
运行结果
小美住在上海 5️⃣ 结构体函数参数
三种传递方式对比
方式语法特点值传递void func(Student s)创建副本效率低指针传递void func(Student *s)直接操作原数据✅引用传递void func(Student s)最推荐方式
// 引用传递修改结构体
void raiseScore(Student s, float bonus) {s.score bonus;
}Student stu {小林, 19, 80};
raiseScore(stu, 5.5);
cout 新成绩: stu.score; // 85.5 6️⃣ 结构体const保护
防手抖神器
struct Account {string id;float balance;// const成员函数禁止修改数据void show() const {// balance 0; // ❌ 禁止修改cout 账户: id 余额: balance;}
};int main() {const Account acc {666, 5000};// acc.balance 0; // ❌ 禁止修改常量结构体acc.show(); // ✅ 允许只读操作
} 三、综合应用员工管理系统
#include iostream
using namespace std;struct Employee {int id;string name;double salary;
};// 打印员工信息
void printEmp(const Employee *emp) {cout ID: emp-id 姓名: emp-name 薪水: emp-salary endl;
}// 加薪函数
void raiseSalary(Employee *emp, double percent) {emp-salary * (1 percent/100);
}int main() {Employee e1 {101, 张三, 8000};cout 加薪前 endl;printEmp(e1);raiseSalary(e1, 15); // 加薪15%cout \n 加薪后 endl;printEmp(e1);return 0;
}
运行结果 加薪前
ID:101 姓名:张三 薪水:8000 加薪后
ID:101 姓名:张三 薪水:9200 核心要点总结表
知识点关键语法使用技巧指针定义int *p 变量;用前初始化为nullptr空指针nullptr操作前检查是否为空const指针const int *p按需选择保护模式指针数组int *p arr;p1指向下一个元素结构体定义struct {成员...};相关数据打包管理结构体指针Student *ptr s;访问成员用ptr-name结构体嵌套结构体包含结构体成员实现数据分层管理const结构体void func() const {...}防止意外修改成员数据 ✨学习心得 1️⃣ 指针像激光笔 - 精准指向内存位置但别晃到危险区域 2️⃣ 结构体像收纳盒️ - 把杂乱数据整理得井井有条 3️⃣ const是护身符 - 重要数据加上保护防误改 4️⃣ 多写注释 - 复杂指针操作一定要标注清楚 5️⃣ 画内存图 - 遇到困惑就画图辅助理解