1.基本概念
指针,就是地址,地址是编号,编号是数字
指针变量,就是用于存放指针的变量,存放地址的变量,存放数字的变量
2.指针变量定义的语法格式
数据类型 *变量名称;
int * pi;
int pi;
int pi;
语义:定义一个指针变量pi
编译器会为该变量pi分配4字节内存空间,该4字节内存空间中存储int类型变量的地址
3.指针变量的初始化
int a = 29;
int *p = &a;
*4.&取地址运算符 和 解引用运算符
&,取地址运算符 //不是按位&运算符 编译器会根据语境去做区分
,解引用运算符 //不是乘法运算符
编译器会根据语境去做区分
int a = 12; //a 是int 类型变量
int *pi = &a; //&取地址运算符 将a变量的首地址存储变量pi对应的4字节内存中去
*pi = 100; // 和 a= 100等价 将100写入到pi指向的内存
// 先根据变量名pi 找到pi对应内存
// 将pi内存中的数据读取出来作为地址使用
// 使用该地址就寻址 找到该地址对应的内存 (变量a对应的内存)
// 将100写入找到的内存中去
int b= 0;
b = *pi; //读取pi指向内存中的数据赋值b
// 先根据变量名pi 找到pi对应的内存
// 将pi内存中的数据读取出来作为地址使用
// 使用该地址去寻址 找到该地址对应的内存 (变量a对应的内存)
// 将该内存中的数据读取出来 赋值被变量b
5.指针在使用过程容易犯的错误
1)定义指针变量时容易犯的错误
int *pa, *pb; //定义了两个int 类型的指针变量 pa pb
int *pa, pb; //定义了一个int 类型的指针变量pa 和一个int类型的变量pb
2) 修改指针变量时容易犯的错误
int a, b;
//定义并初始化时 可以pa如此赋值
int *pa = &a; //定义指针变量pa并初始化, 对应内存中存储 a变量的地址
//定义完pa之后,后续操作要改pa变量的内容 不能写成*pa = &b;
//应该写成如下形式
pa = &b; //修改pa中存储的内容 原来存的是a的地址 现在存储b 的地址
*pa = b; //将b变量的值写入pa 指向的内存中去
3) 指针变量占据的内存空间
32bit的机器上:指针变量占据的内存空间统一为4字节
int *pa = &a; //指针变量是变量 ,变量pa占几字节的内存空间? 4字节
char c = 'm';
char *ps = &c; //定义了一个char 类型的指针变量ps
//ps中应该存储 char类型变量的地址
//变量ps占几字节的内存空间呢? 4字节
64bit的机器上:指针变量占据的内存空间统一为8字节
int *pa / char *ps /short *ph /long *pg ;占据的内存空间大小统一为8字节
6.特殊指针:空指针和也指针
6.1空指针
指针变量中存储了一个空地址,空地址使用NULL表示,其实就是编号为0地址;
例如:
int *pa = NULL; //pa变量中存储的是地址0
空指针指向的内存不能访问,如果访问直接造成程序崩溃!
printf("pa指向的0地址内存中数据是:%#x\n", *pa); //对0地址内存执行读操作 程序直接崩溃
*pa = 100; //对0地址内存执行写操作 程序直接崩溃
注意:如果定义了一个全局的指针变量 没有做初始化
系统也会自动给其赋0值(NULL)
int *g_pa; //等价于 int *g_pa = NULL;
6.2 野指针
就是没有初始化的局部指针变量,该变量中存储是一个随机值
指向的内存位置不确定,
如果访问野指针指向任意内存位置 ,极容易造成程序的崩溃
例如:
int *pa; //函数内部定义 ,pa就是一个野指针
*pa = 200; //很容易造成程序的崩溃
C编程过程中要杜绝野指针的出现:造成有时正常运行 有时程序崩溃
如果没有可以赋值的有效值
一般将该指针变量赋值为NUL