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
};
通过结构体创建结构体变量
的方式有三种:
方式1:struct 结构体名 变量名
方式2:struct 结构体名 变量名 = { 成员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]中