立即学习:https://edu.csdn.net/course/play/10534/378148?utm_source=blogtoedu
什么是指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
type *var_name = NULL;
基本类型指针:
int *p = NULL; /* 一个整型的指针 */
double *p = NULL; /* 一个 double 型的指针 */
float *p = NULL; /* 一个浮点型的指针 */
char *p = NULL; /* 一个字符型的指针 */
“*”的位置只要是在中间就可以,可以是 int* p, int * p, int *p,具体怎么放,根据项目的编程规范或者约定来。保持统就好。
怎么理解指针?
图片: https://uploader.shimo.im/f/fW0GybTk0z3vRGyV.png
寻址空间:
寻址空间一般指的是 CPU 对于 内存寻址 的能力。通俗地说,就是能最多用到多少内存的一个问题。
32 位机器:2^32 = 0xFFFFFFFF
64 位机器:2^64 = 0xFFFFFFFFFFFFFFFF
基本类型指针使用
int *p = NULL; // 首先定义 int 类型的指针
int a = 0; // 再定义一个 int 类型的变量
printf("p 指向地址: %p", p); // 输出指针的值
p = &a; // 通过取地址运算符'&'获取变量 a 的内存地址,赋值给指针变量
printf("p 指向地址: %p", p); // 输出指针的值
printf("a 变量地址: %p", &a); // 输出变量的地址值
a = 10; // 修改变量的值
printf("a = %d, *p = %d", a, *p);
// 通过指针来修改变量的值
*p = 20;
printf("a = %d, *p = %d", a, *p);
/*[看视频]实战编码:编写上面代码,通过命令行输入变量 a 的初始值,然后再输入一个新的值通过指针 p 访问变量 地址,来修改变量 a 的值。分别输出修改前后的值。*/
使用指针时会频繁进行以下几个操作:
定义一个指针变量;
把变量地址赋值给指针;
访问指针变量中可用地址的值。
注意:在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。NULL 指针是一个定义在标准库中的值为零的常量。
检测指针的有效性
int *p = NULL;
if (p) {
// 如果指针不为空,使用指针。
} else {
// 如果指针为空,做异常处理。
}
/* [看视频]实战编码:验证在指针为 NULL 和不为 NULL 的情况下,程序怎么运行效果。*/
野指针
int *p; // 不是
void far() {
int *p1; // 是
int *p2 = 0x0000FFFF; // 是
int a = 0;
int *p3 = &a; // 不是
}
/* [看视频]实战编码:编写程序验证它是不是野指针。*/
课后作业
如课程中的例子一样,定义一个 char 类型的指针,通过指针来修改 char 变量的值,输出修改前后的指针和变量地址,分别使用变量和指针的方式输出变量的值。
int main() {
char c = 'A';
char *p = &c;
printf("p = %p, &c = %p\n", p, &c);
printf("c = %c, *p = %c\n", c, *p);
*p = 'a';
printf("c = %c, *p = %c\n", c, *p);
return 0;
}
// 看视频