一、基本概念
指针是C语言中一个非常重要的概念,它是C语言中的一种变量类型,用于存储内存地址。指针变量必须先定义后使用,定义指针变量时需要指定变量类型,指向的是该类型的变量。指针可以进行赋值,指向不同的内存地址,也可以进行比较。
指针的赋值操作是将指针变量的值设为某个内存地址,这个内存地址可以是一个变量的地址,也可以是动态分配的地址。
二、指针赋值方法
指针赋值有四种基本方式:
1. 直接赋值
int a = 100; int* p; p = &a;
以上代码中,指针变量p被直接赋值为变量a的地址。
2. 动态分配内存赋值
int* p; p = (int*)malloc(sizeof(int));
以上代码中,使用malloc函数动态分配一段内存,用p指针变量指向该内存。需要使用free函数释放该内存。
3. 指针变量间赋值
int a = 100; int* p1; int* p2; p1 = &a; p2 = p1;
以上代码中,p1指向变量a的地址,p2被赋值为p1,即p2也指向a的地址。
4. 数组指针赋值
int a[5] = {1,2,3,4,5}; int (*p)[5]; p = &a;
以上代码中,定义了一个5个元素的数组a,p指针指向整个数组a,并且p的类型是int(*)[5],表示指向5个元素的整形数组类型。
三、指针赋值细节问题
1. const修饰符
指针变量定义时可以加入const符号,可以通过const修饰符来将指针变量设为常量,防止指针变量指向的值被修改。
const int* p1; int* const p2;
以上代码中,p1是一个常量指针,不能通过指针变量修改指向的值。p2是一个指针常量,指向的值可以被修改,但指向的地址不能被改变。
2. 空指针
空指针是指未被初始化的指针,或指向空内存地址的指针。
int* p = NULL;
以上代码中,p指针被初始化为空指针。
3. 野指针
野指针是指指针变量指向的内存地址未被初始化或已被释放的地址。
int* p; *p = 10; //错误的赋值操作
以上代码中,p指针变量未被初始化,指向的地址未知,赋值会发生不可预知的结果,是错误的操作。
四、常见错误
1. 取消赋值操作
指针变量赋值后,如果操作不当,可能会导致指针指向错误的内存地址,从而引发未知的错误。
int* p = NULL; if (p != NULL) { *p = 10; }
以上代码中,判断p是否为空指针是废话,因为p已经被初始化为空指针了,取消判断语句即可。
2. 忘记释放动态内存
动态分配内存需要手动释放,否则会导致内存泄漏问题。
int* p; p = (int*)malloc(sizeof(int)); // do something free(p); // 必须手动释放内存
以上代码中,动态分配了一段内存,用完之后需要手动释放,否则会导致内存泄漏。
3. 遗漏变量类型
指针变量定义时必须指定变量类型,否则会导致程序编译错误。
p = 100; // 缺少变量类型定义,编译错误 int* p = 100; // 正确初始化方式
五、总结
指针是C语言中非常重要的概念,在编写程序时经常会用到。正确的指针赋值方法和技巧,可以帮助我们更好地编写程序。