疫情学习第四天:C++指针结构体

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值