C++学习笔记 Ⅱ
指针
可以通过指针间接访问一段内存
注意:
- 内存编号都是从0开始的,一般用十六进制数来表示;
- 可以利用指针变量保存地址;
语法:
数据类型 * 指针变量
例:
int a = 10;
int *p;
p = &a;
直接输出p为p指向的地址
如果需要输出p指向的地址内内容
可以通过解引用的方法:
在指针变量前加 “*”
指针占用的内存空间
32位操作系统占用4个字节
64位操作系统占用8个字节
空指针
指针变量指向内存编号为0的指针
用途: 初始化指针变量
注意: 空指针指向的内存不能被访问
int *p = NULL;
野指针
指针变量指向非法的内内存空间
const修饰指针
- const修饰指针 —常量指针
const int *p = &a;
指针的指向可以修改,但指针指向的值不可以修改; - const修饰常量 —指针常量
int * const p = &a;
指向指向的值可以修改,但指针的指向不可以修改; - const既修饰指针又修饰常量
const int * const p = &a;
指针的指向和指向的值都不可以修改;
指针和数组
利用指针访问数组中的每个元素
#include<iostream>
using namespace std;
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
for (int i = 0; i < 10; i++)
{
cout << *p << endl;
p++;
}
return 0;
}
结果:
指针和函数
利用指针做函数参数,可以修改实参的值;
例:
利用指针交换两数的值
#include<iostream>
using namespace std;
void swap_01(int *p1,int *p2)
{
int temp = 0;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << "交换前:" << endl;
cout << "a=" << a << " " << "b=" << b << endl;
swap_01(&a, &b);
cout << "交换后:" << endl;
cout << "a=" << a << " " << "b=" << b << endl;
}
结果:
指针、数组、函数
例:
封装一个函数,利用冒泡排序,实现对整型数组的升序排列
#include<iostream>
using namespace std;
void bubbS(int *arr,int len)
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void PrintArr( int *arr,int len)
{
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
int len = sizeof(arr) / sizeof(arr[0]);
cout << "排序前:";
PrintArr(arr, len);
bubbS(arr,len);
cout << "排序后:";
PrintArr(arr, len);
}
结果:
结构体
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型;
语法: struct 结构体名{结构体成员列表};
通过结构体创建变量的三种方法:
- struct 结构体名 变量名;
- struct 结构体名 变量名 = { 成员1值,成员2值…};
- 定义结构体时顺便创建变量;
例:
#include<iostream>
using namespace std;
#include<string>
struct Student
{
string name;
int age;
int score;
}s3;
int main()
{
struct Student s1;
s1.name = "大哥";
s1.age = 22;
s1.score = 100;
cout << "姓名:" << s1.name <<" " << "年龄:" << s1.age << " " << "分数:" << s1.score << " " << endl;
struct Student s2 = { "二弟",20,98 };
cout << "姓名:" << s2.name << " " << "年龄:" << s2.age << " " << "分数:" << s2.score << " " << endl;
s3.name = "三弟";
s3.age = 18;
s3.score = 60;
cout << "姓名:" << s3.name << " " << "年龄:" << s3.age << " " << "分数:" << s3.score << " " << endl;
}
结构体数组
将自定义的结构体放入数组中方便维护
语法: struct 结构体名 数组名[元素个数] = { {},{},... };
例:
#include<iostream>
using namespace std;
#include<string>
struct Student
{
string name;
int age;
int score;
};
int main()
{
struct Student sarr[3] =
{
{"大哥",22,100},
{"二哥",20,98},
{"三弟",18,60}
};
sarr[2].score = 61;
for (int i = 0; i < 3; i++)
{
cout << "姓名:" << sarr[i].name << " " << "年龄:" << sarr[i].age << " " << "分数:" << sarr[i].score << " " << endl;
}
}
结果:
结构体指针
通过指针访问结构体中的成员
- 通过操作符 -> 可以通过指针访问结构体属性
例:
#include<iostream>
using namespace std;
#include<string>
struct Student
{
string name;
int age;
int score;
};
int main()
{
struct Student s1;
s1.name = "大哥";
s1.age = 22;
s1.score = 100;
Student* p = &s1;
cout << "姓名:" << p->name << " " << "年龄:" << p->age << " " << "分数:" << p->score << " " << endl;
}
结果:
结构体嵌套结构体
例: 创建一个老师信息,包含所带学生信息
#include<iostream>
using namespace std;
#include<string>
struct Student
{
string name;
int age;
int score;
};
struct Teather
{
int id;
string name;
int age;
struct Student s1;
};
int main()
{
struct Student s1;
s1.name = "小宝子";
s1.age = 22;
s1.score = 100;
struct Teather t1;
t1.id = 2022;
t1.name = "老可爱";
t1.age = 25;
cout << "老师id:" << t1.id << " "<< "老师姓名:" << t1.name << " " << "老师年龄:" << t1.age << " " << endl;
cout << "该老师辅导的学生姓名:" << s1.name << " " << "学生年龄:" << s1.age << " " << "学生分数:" << s1.score << endl;
}
结果:
结构体做函数参数
例: 将学生信息传入到函数中,打印学生信息
#include<iostream>
using namespace std;
#include<string>
struct Student
{
string name;
int age;
int score;
};
void prints1(struct Student s1)
{
cout << "姓名:" << s1.name << " " << "年龄:" << s1.age << " " << "分数:" << s1.score << " " << endl;
}
void prints2(struct Student* p)
{
cout << "姓名:" << p->name << " " << "年龄:" << p->age << " " << "分数:" << p->score << " " << endl;
}
int main()
{
struct Student s1;
s1.name = "大哥";
s1.age = 22;
s1.score = 100;
prints1(s1);
struct Student s2 = { "二弟",20,98 };
prints2(&s2);
}
结果: