7 指针
7.1指针的定义和使用
1.如何定义一个指针 int * p
如何让指针记录变量的地址p=&a
a的地址&a
指针变量 p
2.使用一个指针:可以用解引用的方式找到指针指向的内存。*p
指针前加*,找到指针指向的内存*p = 1000
7.3指针占用的内存
另一种写法 int * p =&a
看占用的内存空间大小 sizeof(int *)
或者sizeof(p)
不管是什么数据类型的指针,都占用4个字节的内存(32位操作系统),8(64位操作系统)
7.4 空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量,一开始不知道指向的是什么int *p = NULL
注意:空指针指向的内存是不可以访问的*p=100
错误不可以访问的*p
错误
野指针:在程序中,尽量避免出现野指针int *p = (int *)0x1100
,*p是错误的
7.5 const修饰指针
1.const修饰指针—常量指针
2.const修饰常量—指针常量
3.const修饰指针又修饰常量
1.常量指针:指针的指向可以修改,但是指针指向的值不可以修改
const int *p =&a;
*p=20(错误)
p=&b(正确)
2.指针常量:指针的指向不可以修改,但是指针指向的值可以修改
int * const p = &a;
*p=20(正确)
p=&b(错误)
3.const修饰指针又修饰常量,指针的指向不可以修改,指针指向的值不可以修改
const int * const p = &a;
*p=20(错误)
p=&b(错误)
7.6 指针和一维数组
利用指针来访问数组元素
arr[3]={1,2,3}
arr[0]//第一个元素为
int * p = arr;//arr就是首地址
*p; //用指针访问第一个元素,解出来四个字节
p++;//指针向后偏移四个字节
*p; //利用指针访问第二个元素
7.7 指针和函数
void swap02(int *p1,int *p2)
{
int temp = *p1;//指针p1把a的地址保存下来,*p1是解引用,temp保存的是一个数字
*p1 = *p2;//把p2的值赋值给了p1的解引用
*p2 = temp;
}
int main()
{
int a = 10;
int b = 20;
swap02(&a,&b);//传的是地址,如果是地址传递可以修饰实参
}
值传递不会修改实参,地址传递会修改实参
案例分析
利用冒泡排序,实现对整型数组的升序排序
2.创建
//冒泡排序函数参数1,数组的首地址,参数2 数组长度
void bubblesort()
{
for (int i = 0; i<len-1;i++)
{
for (int j = 0;j<len-i-1;j++)
{
if (arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j]= arr[j+1];
arr[j+1] = temp;
}
}
}
}
//1.先创建一个数组
int arr[10] = {4,3,6,9,1,2,10};
int len = sizeof(arr) / sizeof(arr[0]);
//2.创建函数,实现冒泡排序
bubblesort(arr,len)//传入数组的首地址和数组的长度
//3.打印排序后的数组
8 结构体
8.1 结构体基本概念
自定义数据类型,允许用户储存不同的数据类型
8.2 结构体的定义和使用
语法:struct 结构体名 {结构体成员表}
struct 结构体名 变量名,结构体定义的方式
struct student
{
string name;
int age;
int score;
}
1.第一种结构体变量创建方式1的方法
int main()
{
struct student s1;
s1.name = "张三";
s1.age = 18;
s1.score = 100;
}
2.通过学生类型创建具体学生
int main()
{
struct student s2 = {"李四",19,80}
}
3.在定义结构体的时候顺便创建结构体变量,不建议使用
struct student
{
string name;
int age;
int score;
}.s3
s1.name = "张三";
s1.age = 18;
s1.score = 100;
8.3结构体数组
struct 结构体名 数组名[元素个数]= { {},{},{}}
数组中每一个元素都是struct
创建结构体数组
//初始化的时候就给值
struct student stuarray[3] =
{
{"张三",18,100},
{"cds",18,99}
};
stuarray[2].name = "赵烈";
8.4 结构体指针
通过指针指向结构体变量
student s = {"张三",18,100};
struct * p = &s;(struct可以省略)
通过指针访问结构体变量的数据,通过结构体指针访问结构体属性,需要利用‘
->’
p ->name
8.5 结构体嵌套结构体
struct里面的还是有一个struct
进行初始化的时候,t.stu.age=20
t.ww=4
8.6 结构体做函数参数
将结构体作为参数向函数传递
传递方式有两种:值传递、地址传递。
将学生传入参数中,打印学生的所有的信息
//值传递
void printstudent1(struct student s)
{
cout<<"姓名"<<s.name
}
printstudent1(s)
//地址传递
//将函数中的形参改为指针可以节省内存空间,而且不会复制出新的副本出来
void printstudent2(struct student *p)
{
cout<<"姓名"<< p->name
}
printstudent2(&s)
8.7 结构体中用const使用场景
//将函数中的形参改为指针可以节省内存空间,而且不会复制出新的副本出来
void printstudent2(const struct student *p)//加入const之后一旦进行修改就会报错,s->age = 50是错误的,防止误操作
{
cout<<"姓名"<< p->name
}
8.8 结构体案例
不想写了
通讯录管理系统里面的06
到类与对象23