#include<stdio.h> intmain() { int arr[10] = {0}; int* p = arr;//数组名-首元素地址,创建的指针变量p,存放了数组中第一个元素地址。 int i = 0; for (i=0; i<10; i++) { *(p+i) = 1; }//把数组中每个元素都改成了1 return0; }
野指针
野指针就是指指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针原因
1、指针未初始化
1 2 3 4
int a;//局部变量不初始化,默认是随机值。 int* p;//局部的指针变量,就被初始化随机值。 *p = 20; }
2、指针越界访问
1 2 3 4 5 6 7
int arr[10] = {0}; int *p = arr; int i = 0; for (i=0; i<12; i++) { p++;//越出了数组范围 }
3、指针指向的空间释放了
1 2 3 4 5 6 7 8 9 10
int* test() { int a = 10; return &a; } intmain() { int *p = test(); *p = 20;//地址指向的空间已经释放了。 }
如何避免野指针?
指针要初始化
小心指针越界
指针指向空间释放即使置NULL-不知道给什么值就给NULL
指针使用之前检查有效性
指针运算
指针+-整数
指针-指针
指针的关系运算
1 2 3 4 5 6 7 8 9 10 11 12
#include<stdio.h> intmain() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); int* p = arr; for (i=0; i<sz; i++) { printf("%d ",*p); p = p + 1; } return0; }
1 2
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; printf("%d\n",&arr[9] - &arr[0]);
#include<stdio.h> intmain() { int arr[10] = {0}; int* p = arr; int i = 0; for (i = 0;i<10; i++) { *(p+i) = i; } for (i = 0;i<10; i++) { printf("%d\n",arr[i]); } }
二级指针
1 2 3 4 5 6 7 8
#include<stdio.h> intmain() { int a = 10; int* pa = &a;//pa就是一级指针变量,int*就是一级指针类型 int** ppa = &pa;//ppa就是二级指针变量,int**就是二级指针类型 int*** pppa = &ppa; //三级指针 return** 0; }
#include<stdio.h> intmain() { int a = 10; int* pa = &a;//pa就是一级指针变量,int*就是一级指针类型 int** ppa = &pa;//ppa就是二级指针变量,int**就是二级指针类型 printf("%d\n",**ppa); **ppa = 20;//通过二级指针修改a的值 printf("%d\n",**ppa); return0; }
打印的结果是10和20
指针数组
指针数组 本质是数组 - 存放指针的数组
数组指针 本质是指针
整型数组 - 存放整型
字符数组 - 存放字符
指针数组 - 存放指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include<stdio.h> intmain() { int a = 10; int b = 20; int c = 30; // int* pa = &a; // int* pb = &b; // int* pc = &c; int* arr[3] = {&a,&b,&c};//指针数组 int i = 0; for (i = 0; i<3; i++) { printf("%d ",*(arr[i])); } }