资料来源:南科大 于仕琪 C/C++ Program Design
LINK:
- CPP/week05 at main · ShiqiYu/CPP (github.com)
- 5.1-pointers_哔哩哔哩_bilibili
- 5.2-pointers-and-arrays_哔哩哔哩_bilibili
- 5.3-allocate-memory-C-style_哔哩哔哩_bilibili
- 5.4-allocate-memory-CPP-style_哔哩哔哩_bilibili
0 概述
本节主要介绍指针、数组以及计算机内存分配理论。
1 Pointers 指针
- 指针变量里存储的是地址,加上*后就是只向地址上的值
1.1 普通指针
int num = 10;
int * p1 = NULL, * p2 = NULL; // declaration two pointers, initialized to 0
p1 = # // take the address of num, assign to p1
p2 = # // take the address of num, assign to p2
*p1 = 20; // assign 20 to num
*p2 = 30; // assign 30 to num
- p1 p2 均指向num开始的位置
- 利用p1和p2指针对num数值进行修改了两次
- cout<<*p1 输出和 cout<<num 输出一样
1.2 结构体指针
- 结构体中使用指针去指向结构体中的成员member, p->member 和 (*p).member 是等价的

-
* pStu = &stu 使得指针指向结构体开始的位置
-
通过使用指针修改了结构体stu内的数据
1.3 指针存储的地址
由于指针指向的是地址,因此可以输出其地址
-
在C语言中,可以使用%p输出地址(其实也可以用unsigned int类型输出,但是地址可能是32/64位,不一定是无符号整型,因此用%p可以自动匹配)
-
指针实质:存储地址
-
1.4 指针的指针
- 可以通过指针的指针连环指向num
1.5 常数指针
- const int * p1 --不能通过常数指针修改指向的内容num,直接修改num是可以的
- int * const p2 --指针指向的地址是恒定的,不能修改
- const int * const p3--地址和内容都不可以修改
- 用途:可以在函数的传递中常数指针,防止数据被修改。
- 注意:常数指针不能赋值给普通指针,否则会报错。
2 指针和数组
2.1 数组的地址
2.2 数组的名字

- 可以认为数组是一个指针,存的就是一个地址
- 对数组的取地址操作不是指针的指针
- 数组首元素地址就是数组的地址
2.3 指针运算
- 指针加减的单位是元素

2.4 指针和数组的区别
- 数组是一个常数指针,指向的地址不能更改。
- 使用sizeof()进行操作时,数组的结果为 元素*sizeof(类型);指针返回的结果为指针所存储地址占用的大小(4或8)。
3 C语言内存分配
3.1 系统存储结构

3.2 内存分配
为什么使用动态内存分配-LINK:【C语言进阶篇】动态内存分配和数组的动态内存分配_c语言动态内存分配二维数组-优快云博客