-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0405_C指针
63 lines (46 loc) · 3.02 KB
/
0405_C指针
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
3 C语言内存空间使用
3.1 指针
概念:指针是内存地址,指针变量是存放内存地址的变量,什么类型的变量对应指针也要是相同类型,例如:int var_test; 要定义一个
指针存放var_test的地址,也要用int型的指针, int *p;
声明方式:
type *var_name;
*表示指针,告诉计算机要声明一个指针
var_name 表示这个指针名字叫var_name
type表示这个指针的类型,例如int、float、double等
常用的声明格式:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,
都是一个代表内存地址的长的十六进制数,不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
地址赋值方式,采用“&”符号:
int var = 20; /* 实际变量的声明 */
int *ip; /* 指针变量的声明 */
ip = &var; /* 在指针变量中存储 var 的地址 */
通常使用指针的步骤:定一个变量 => 定义一个指针变量 => 把变量的地址给指针 => 后续访问指针变量中可用的地址的值
3.1.1 指针+修饰符【const、voliatile、typedef】
(1)【const】常量、只读。不可改变
const char *p; 通常表示这个指针可以随意指向任何一个地址,但是所指向这个地址里的内容不变。(一个指针指向的内容类型是const)
例如,"hello world" "Hi, siri",这两个字符串变量*p都可以指向,但是字符串是固定的,不会变成"helle world"
char *const p; 通常表示这个指针可指向的地址是固定的,但是地址里的内容可变(一个常量的指针p,指向了存放char类型的变量的地址)
通常用于硬件资源定义,比如芯片焊死了寄存器,对应的地址固定了,但是地址里的内容可变,通过改变内容来改变功能。
const char *const p; 地址和地址对应的内容都不可以变,通常用于ROM
【const实例】比如常用的printf函数,系统文件内定义 int printf(const char *format, ...),""内的内容为字符串,
可认为是const char,所以通常使用printf函数时都是开始都先用"".
char *p = "abcdefg";
printf("the one address is %lu\n", *p); //p读取整个内存地址, *p表示读取内存的方式,之前定义了char类型,所以1个字节读取。
printf("the total address is %x\n", p);
char buff[] = { "Hello World!" }; // buff数组是main函数内,是可变的
char *cp = buff;
*cp = 'd';
printf("the change total address is %x\n", cp);
printf("the change one address is %lu\n", *cp);
printf("the change one is %s\n", buff); //dello World! 祥见0405
【voliate】防止优化内存
3.1.2 指针+运算符【++、--、+、-、[]、.】
3.1.3 多级指针
3.2 数组
3.3 结构体、共用体
3.4 内存分布图
3.5 段错误分析