1. 指针是什么?
1. 指针是内存中一个最小单元的编号
2. 口头上的“指针”,指的是指针变量
#include<stdio.h> int main() { int a=10; int * pa=&a;// pa 是一个指针变量,用来存放 a 的地址 //int ——> pa 所指向对象的类型 //* 代表 pa是个指针变量 return 0; }
3. 编址
4. 指针变量大小
//32位机器上,地址是32个0/1组成的二进制序列,地址要用4个字节的空间来储存 //指针在32位平台上,占4个字节 //在64位平台上,占8个字节
2. 指针和指针类型
1. 内存中的信息
2. 指针类型的意义
2.1[
//指针的类型,决定了指针解引用时,访问多少个字节 —— 指针的访问权限 //short* ——> 2 //int* ——> 4 //float* ——> 4 //double* ——> 8 //...
#include<stdio.h> int main() { int a=0x11223344; //在内存中开辟四个字节的空间; //放入44 33 22 11 //"44" 所占空间的地址 就是 a 的地址 char* pa=&a; *pa=0; //将 44 33 22 11 ——> 00 33 22 11 return 0; }
2.2
//指针的类型决定了 指针+1 操作时的步长 // //char* 类型的指针 +1时,跳过 1 个字节 //int* 类型的指针 +1时,跳过 4 个字节 // //type* p ,p +/- n //跳过 n* sizeof(type) 个字节
3. 野指针
3.1
1. 指针未初始化
#include<stdio.h> int main() { int* pa; *pa=10; //局部变量指针未初始化,为随机值 return 0; }
2. 指针越界访问
#include<stdio.h> int main() { int arr[10]={0}; for(int i=0;i<11;i++) { *(p++)=i; //i=10,指针的指向超出了数组范围 ,此时为野指针 } return 0; }
3. 指针所指向的空间释放
#include<stdio.h> int* test() { int a=10; return &a; } int main() { int* p=test(); printf("%d\n",*p); //出test()后,a所在空间还给操作系统了 //此时 p 为野指针 return 0; }
3.2 规避野指针
1. 指针初始化
#include<stdio.h> int main() { int a=0; int* pa=&a; int* pc=NULL;//如果不知道指针初始化为何值,暂时初始化为 NULL return 0; }
2. 指针指向的空间释放,及时置 NULL
#include<stdio.h> int* test() { int a=10; return &a; } int main() { //避免返回局部变量的地址 int* p=test(); p=NULL; return 0; }
3. 指针使用之前检查有效性
#include<stdio.h> int main() { int a=10; int* pa=&a; int* ptr=NULL; if(ptr != NULL) { //使用ptr } return 0; }