C++笔记2:c++基础入门2

本文详细介绍了C++中的指针概念,包括指针变量、指针内存占用、空指针与野指针的区别,以及const修饰指针的用法。此外,还讲解了指针与数组的关系,并提供了示例。同时,文章涵盖了结构体的基础知识,包括如何声明、初始化和使用结构体,以及结构体数组、结构体指针和结构体嵌套的应用。最后,提到了在通讯录管理系统中处理结构体的一些常见操作,如字符串比较、结构体清空和复制。
摘要由CSDN通过智能技术生成

0721
1、指针
1.1 指针变量

  • 普通变量存放的是数据,指针变量存放的是地址
  • 指针变量可以通过 * 操作符,操作指针变量指向的内存空间,这个过程称为解引用(*p)
  • 可以通过&符号获取变量的地址(&p)

1.2 指针所占内存
32位OS下占4个字节
64位OS下占8个字节

1.3 空指针和野指针不可访问

	//空指针:
	int* p1 = NULL;
	cout << p1 << endl;//00000000,空指针的地址为0
	//cout << *p1 << endl;  引发了异常: 读取访问权限冲突。因为p1是 nullptr。
//野指针:
	int* p2 = (int*)0x1100;
	cout << p2 << endl;//00001100
	//cout << *p2 << endl; 引发了异常: 读取访问权限冲突。p2 是 0x1100。

空指针和野指针都不是我们申请的空间,因此不可访问。

1.4 const修饰指针
看const右侧紧跟着的是指针还是常量:
是指针就是常量指针(指向的地址固定,即p是个常量,必须在初始化时就指名指向的地址int* const p = &a;);
是常量就是指针常量(指向的值固定,即*p是个常量)

//const修饰指针:
	//①const int* p; 指向的值(*p)固定,指向的地址(p)可变
	const int* p;
	int a = 3, b = 4;
	p = &a;
	cout << *p << endl;//3
	a++; cout << a << endl;//4

	p = &b;//指向的地址可以改
	cout << *p << endl;//4
	b++;  cout << b << endl;//5
	
	cout << (*p) + 10 << endl;//10+5
	//(*p) += 10;由于const紧挨着int,所以(*p)是常量
	//错误	C3892	“p” : 不能给常量赋值197
	//cout << *p << endl;

	cout << endl;
	//②int* const p = &c; 指向的地址p固定,指向的值(*p)可变
	int c = 3, d = 4;
	//int* const p;//指向的地址固定,所以在初始化时就要指定要指向的地址
	//错误	C2734	“p” : 如果不是外部的,则必须初始化常量对象
	int* const p1 = &c;
	//p1 = &d;  因为const紧挨着p,所以p是常量
	//错误	C3892	“p1” : 不能给常量赋值
	(*p1) += 10;//值可以变
	cout << *p1 << endl;//13
	cout << c << endl;//13
	c++;
	cout << *p1 << endl;//14
	
	//③const int* const p = &c;  指向的值固定,指向的地址也固定
	int e = 5, f = 6;
	const int* const p2 = &e;
	//p2 = &f;指向的地址也固定
	//(*p2)++;指向的值固定
	cout << (*p2) * 10 << endl;//5*10

1.5 指针和数组

//指针和数组
	int arr[] = {2,1,4,3,6,5,8,7,10,9};
	int* p = arr;
	int len = sizeof(arr) / sizeof(arr[0]);

	for (int i = 0; i < len; i++)
		cout << arr[i] << " ";
	cout << endl;

	for (int i = 0; i < len; i++)
		cout << *(p + i) << " ";
	cout << endl;

2 结构体
语法:

struct 结构体名 { 
	结构体成员1 
	结构体成员2 
}

通过结构体创建结构体变量的方式有三种:

方式1struct 结构体名 变量名
方式2struct 结构体名 变量名 = { 成员1值 , 成员2...}
方式3:定义结构体时顺便创建变量

结构体数组
结构体指针
结构体嵌套

通讯录管理系统中的问题:
1.判断字符串是否相等:
if (delete_name == contactList[i].name)
2.清空结构体:
memset((void*)&contactList, 0, sizeof(tongxunlu));//清空结构体
其中,contactList是结构体变量,tongxunlu是结构体名称。
3.复制结构体:

//后面的往前挪
contactList[j - 1] = contactList[j];//这样写也可以

memcpy(&contactList[j - 1], &contactList[j], sizeof(contactList[j]));//把[j]的内容复制到[j-1]中
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值