指针

基本概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream> 
#include <string>
using namespace std;
int main() {
//指针就是地址,取*操作了就是值
//定义指针:
int a = 10;
int * p;//语法:数据类型 * 指针变量名;通常用p表示指针;
p = &a;//&a为取a的地址,让指针p记录变量a的地址;
//也可以写成:
int *p = &a;//也就是让指针p指向a的地址;
cout << "a的地址是:" << &a << endl;
cout << "指针p是:" << p << endl;

//指针使用:
//通过“解引用”的方式找到指针指向的内存,取*操作;
cout << "*p=" << *p << endl; //指针前加*表示解引用,找到指针指向的内存中的数据;这里为对内存进行读取;
*p = 1000;//这里为对内存进行修改,让指针指向内存为1000的位置;
cout << "a=" << a << endl;
cout << "p=" << p << endl;
cout << "*p=" << *p << endl;

//指针占用的空间:
int b = 5;
//int * p1;
//p1 = &b;
int * p1 = &b;//直接让指针指向b的地址;
cout << sizeof(p1) << endl;//32位系统占用4个字节,64位为8个字节,不管什么数据类型;
cout << sizeof(int*) << endl;//等价于上一行;
cout << sizeof(float*) << endl;
cout << sizeof(double*) << endl;
cout << sizeof(char*) << endl;

//空指针:指向内存中编号为0的变量;
//用途:初始化指针变量;
//空指针指向的内存不可访问!因为0-255之间的内存编号是系统占用的,不可更改!
//int *p2 = NULL; //错误
int *p2 = nullptr; //正确,是空指针

//野指针:指向非法的内存空间;
int *p3 = (int *)0x1100;//不是自己申请的内存空间,不要去访问!
//cout << *p3 << endl;

//const指针:看const后面跟着是什么;
//const修饰指针:
int a1 = 4;
int a2 = 9;
const int *p4 = &a1;//常量指针,指针指向的值不可以改,而指向的位置可以改;
//*p4 = 10;错误!
p4 = &a2;//正确,可以改!

//const修饰常量:
int * const p5 = &a1;//指针常量,指针指向的值可以改,而指向的位置不可以改;
*p5 = 10;//正确,可以改!
//p5 = &a2;错误!

//const修饰指针和常量:
const int * const p6 = &a1;//指针指向的值和指向的位置都不可以改!
//*p6 = 7;错误!
//p6 = &a2;错误!

//指针和数组,用指针访问数组中的元素
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int *p7 = arr;//arr就是数组的首地址;
cout << *p7 << endl;//解引用,取*操作,用指针访问第一个元素;
p7++;//让指针向右偏移4个字节;
cout << *p7 << endl;//访问第二个元素;
int *p8 = arr;//用指针访问所有元素;
for (int i = 0; i < 10; i++) {
//cout << arr[i] << endl;不用指针访问每个元素;
cout << *p8 << endl;
p8++;//指针后移一位
}
system("pause");
return 0;
}

💭注:nullptr 是在C++11引入的一个特殊的字面值,用来安全高效地表示空指针,避免了C语言风格中将 NULL0 用作空指针时可能出现的错误。在 int *p2 = nullptr; 这行代码中,p2 被初始化为指向空对象的指针。这在编程中是一种常见的做法,确保指针在未被正确初始化之前不会访问任何对象,可以避免运行时错误。nullptrNULL 不同,NULL 通常被定义为 0 的宏,而 nullptr 是精确的空指针。

const* 的位置:左定值,右定向。

函数的地址传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
#include <string>
using namespace std;

void swap(int *p1, int *p2)//地址传递,用指针接收传入的地址;
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}

int main()
{
int a = 10;
int b = 20;
swap(&a, &b);//把a和b的地址传入函数,函数中用指针接收地址;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
//地址传递可以修改实参!而值传递不能!
//如果不想实参被修改,函数的参数列表可以写成const;如果想要修改,可以用地址传递,或者引用传递(后续介绍);
system("pause");
return 0;
}

结构体

基本概念

1
2
3
4
5
6
7
struct Student//定义的时候不可以省略掉struct! 一般定义在main函数之前或头文件里;
{
//成员列表
string name;
int age;
int score;
}S3;//顺便直接创建变量;