为什么有指针
汇编中,CPU访问外部内存必须使用汇编中的间接寻址,c语言要访问内存,因此也必须要能实现间接访问,所以有了指针。
左值、右值
放在“=”左边的叫左值,右边的是右值;
左值变量,编译器认为是变量在内存的空间(格子);a=1;将1放入a的格子里;
右值变量,编译器认为是内存(格子)里的数;a=b,将b的内容放入a的格子里;
指针与变量
指针的实质还是变量,全称指针变量;
指向任何类型的指针变量,本身是一个int型,内部永远都是存储地址。
如P=(int *) 4;将以地址0x04开头的连续4个地址(0x04、0x05、0x06、0x07),强制转换成一个指针变量,且这个指针用来指向int型变量;
使用指针3部曲
- 定义指针:int *p;
- 绑定指针:P=&a 或 P=(int *)0x4;
- 解引用: *p=0x321;或a=*p;//与汇编的间接访问相同;
指针的符号 *
在指针中“*”有两种含义,变量定义时添加*,用来声明一个指针变量。解引用时*代表间接寻址的标识符。定义指针变量 int *p 这句话int与*是一个整体,p是另外一个整体。int *p;int * p;int* p;int*p;这4种方法其实都可以,但是在同时定义多个指针变量时不一样,如int* p1,p2,则P1是指针变量,p2是int型常量,所以需要写成 int *p 也是常规写法。解引用 *p = a; a=*p或a= * p;*p是一个整体,不能分开理解。
指针的符号 &
取地址符;定义常量时,编译器自动分配了地址,但是这个地址程序员不知道,正常访问变量时,编译器会把地址里的内容进行读写,如果加了变量前&,编译器就会把变量在内存中的地址读出来。如 p = &a;&a是一个整体,不可分开理解。就是指a的地址;
指针定义并初始化
int a=32;int *p=&a;
野指针的预防
- 定义指针时将初值设为NULL(0)
- 用前判断是否等于NULL
- 用完后将指针指向NULL
const 与指针
cosnt修饰变量是常量(不可被修改),指针也是变量,当然可以被修饰;
cosnt 的意义只是告诉读者和编译器,该变量不会被修改。其实可间接手段修改。cost与变量的结合有多种方式,其各种组合的修饰对象不同,主要是看const与谁先结合。
int * const p ; //const 紧跟p,说明指针本身不能被修改。
const int *p ; //const后面是int,说明p可被修改,指向的变量不能被修改。
int const *p; // const后面是*,说明p可被修改,指向的变量不能被修改。
const int * const p