当前位置 博文首页 > CW_qian的博客:7月27日笔记C语言基础指针0
内存地址
基地址
取址符
int?a = 100;
printf("整型变量 a 的地址是: %p\n", &a);
char?c = 'x';
printf("字符变量 c 的地址是: %p\n", &c);
double?f = 3.14;
printf("浮点变量 f 的地址是: %p\n", &f);
指针基础
int????*p1; // 用于存储 int ?型数据的地址,p1 被称为 int ?型指针,或称整型指针
char???*p2; // 用于存储 char 型数据的地址,p2 被称为 char 型指针,或称字符指针
double?*p3; // 用于存储double型数据的地址,p3 被称为 double 型指针
int?a = 100;
p1 = &a; // 将一个整型地址,赋值给整型指针p1
char?c = 'x';
p2 = &c; // 将一个字符地址,赋值给字符指针p2
double?f = 3.14;
p3 = &f; // 将一个浮点地址,赋值给浮点指针p3
*p1 = 200; // 将 p1 指向的目标(即a)修改为200,等价于 a = 200;
*p2 = 'y'; // 将 p2 指向的目标(即c)修改为'y',等价于 c = 'y';
*p3 = 6.6; // 将 p3 指向的目标(即f)修改为6.6,等价于 f = 6.6;
void型指针
// 指针 p 指向一块 4 字节的内存,且这4字节数据类型未确定
void?*p = malloc(4);
// 1,将这 4 字节内存用来存储 int 型数据
*(int?*)p = 100;
printf("%d\n", *(int?*)p);
// 2,将这 4 字节内存用来存储 float 型数据
*(float?*)p = 3.14;
printf("%f\n", *(float?*)p);
野指针
空指针
????????很多情况下,我们不可避免地会遇到野指针,比如刚定义的指针无法立即为其分配一块恰当的内存,又或者指针所指向的内存被释放了等等。一般的做法就是将这些危险的野指针指向一块确定的内存,比如零地址内存。
// 1,刚定义的指针,让其指向零地址以确保安全:
char?*p1 = NULL;
int??*p2 = NULL;
// 2,被释放了内存的指针,让其指向零地址以确保安全:
char?*p3 = malloc(100); // a. 让 p3 指向一块大小为100个字节的内存
free(p3); ??????????????// b. 释放这块内存,此时 p3 相当于指向了一块非法内存
p3 = NULL; ?????????????// c. 让 p3 指向零地址
指针运算
int??a = 100;
int?*p = &a; // 指针 p 指向整型变量 a
int?*k1 = p + 2; // 向上移动 2 个目标(2个int型数据)
int?*k2 = p - 3; // 向下移动 3 个目标(3个int型数据)
数组名涵义
int?a[3]; ?????????????????// 此处,a 代表整个数组
printf("%d\n", sizeof(a)); // 此处,a 代表整个数组
printf("%p\n", &a); ???????// 此处,a 代表整个数组,此处为整个数组的地址
int?*p = a; ??????// 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
p = a + 1; ???????// 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
function(a); ?????// 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
scanf("%d\n", a); // 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
????????C语言只有在第一含义的场合下表现为数组,其他大部分场合都表现为首元素的地址,当数组表现为首元素地址时,实际上就是一个指向其首元素的指针。数组运算实际上就是指针运算。
数组下标
????????????????????????a[i] = 100; ?等价于 ?*(a+i) = 100;
??a[i] = 100;
*(a+i) = 100;
*(i+a) = 100;
??i[a] = 100;
字符串常量
printf("%d\n", sizeof("abcd")); // 此处 "abcd" 代表整个数组
printf("%p\n", &"abcd"); ???????// 此处 "abcd" 代表整个数组
printf("%c\n", "abcd"[1]); // 此处 "abcd" 代表匿名数组的首元素地址
char?*p1 = "abcd"; ????????// 此处 "abcd" 代表匿名数组的首元素地址
char?*p2 = "abcd"?+ 1; ????// 此处 "abcd" 代表匿名数组的首元素地址
char型指针
????????char型指针实质上跟别的类型的指针并无本质区别,但由于C语言中的字符串以字符数组的方式存储,而数组在大多数场合又会表现为指针,因此字符串在绝大多数场合就表现为char型指针。
????????????????char?*p = "abcd";
多级指针
int?a = 100;
int???*p1 = &a; ?// 一级指针,指向普通变量
int??**p2 = &p1; // 二级指针,指向一级指针
int?***p3 = &p2; // 三级指针,指向二级指针
指针万能拆解法
char???(*p1); ?????// 第2部分:*p1; 第1部分:char;
char??*(*p2); ?????// 第2部分:*p2; 第1部分:char *;
char?**(*p3); ?????// 第2部分:*p3; 第1部分:char **;
char???(*p4)[3]; ?// 第2部分:*p4; 第1部分:char [3];
char???(*p5)(int, float); // 第2部分:*p5; 第1部分:char (int, float);
const 型指针