2.3 指针+-整数
#include <stdio.h> int main() { int a = 10; int* pa = &a; char* pc = &a; printf("%p\n", pa); printf("%p\n", pa+1); printf("%p\n", pc); printf("%p\n", pc+1); return 0; }
总结:
指针类型决定了,指针进行+1、-1的时候,一步走多大(距离)。
举例:创建一个数组,存放10个元素,初始化数组内容为1~10,并打印
#include <stdio.h> int main() { int arr[10] = { 0 }; int* p = &arr[0]; int i = 0; for (i = 0; i < 10; i++) { *p = i + 1; p++; } for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
分析:
因为 p 是整型指针,每一次+1操作都会跳过 4 个字节的空间,因此就可以用指针实现初始化为1~10的操作。
3、野指针
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1野指针的成因
3.1.1.指针未初始化
int main() { int* p;//指针变量未初始化,默认为随机值 *p = 10; return 0; }
这里的局部变量*p 没有初始化,默认为随机值,再进行赋值就是错误的。没有自己的空间存,因此就会出错。
3.12.指针越界访问
int main() { int arr[10] = { 0 }; int* p = arr; int i = 0; for (i = 0; i <= 11; i++) { //当指针指向的范围超出数组arr的范围时,p就是野指针 *(p++) = i; } return 0; }
3.1.3指针指向的空间释放
举例:
#include <stdio.h> int* test() { int a = 0; return &a; } int main() { int* p = test(); *p = 10; return 0; }
因此这里的指针变量也是野指针。
3.2 如何规避野指针
1.指针初始化
2.小心指针越界
3.指针指向空间释放,及时置NULL
4.避免返回局部变量的地址
5.指针使用之前检查有效性
* * * 在以后使用指针前可以使用条件判断,配 合指针使用,就不容易出错 * * *
4、指针运算
4.1 指针 +- 整数
我们来看一段代码:
#include <stdio.h> int main() { float arr[5] = { 0 }; float* p; for (p = &arr[0]; p < &arr[5];) { *p++ = 0; } return 0; }
分析:
这里是 + ,是往后走。如果是 - 的话就是往前走,走的距离由类型决定。