什么是指针
指针存储的是变量的内存地址。
申明指针的方式
通过类型*
进行声明,比如
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
无论哪种类型指针的实际数据,都是一个代表内存地址长的十六进制数。
不同数据类型的指针之间唯一的不同是: 指针所指向的变量或常量的数据类型不同。
如何使用指针
int i = 90;
//指针变量,创建一个int类型的指针
int* p = &i;
//间接赋值,在指针变量中存储 i 的地址
*p = 200;
printf("i的值为:%d\n", i);
printf("p的值为:%#x\n", p);
printf("p指向的值为:%#x\n",*p);
printf("i的地址为:%#x\n", &i);
printf("p的地址为:%#x\n", &p);
打印结果显示
i的值为:200
p的值为:0xbbfce8
p指向的值为:200
i的地址为:0xbbfce8
p的地址为:0xbbfcdc
指针为什么要有类型?
指针是有类型的,而地址没有类型。
地址只是记录开始的位置,类型告诉读取到什么位置结果。
int* 读取4字节,double* 读取8字节
空指针
空指针内存地址为0,内存地址为0x000000。
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋值一个NULL值是一个良好的编程习惯。
int *p = NULL; //空指针
打印结果为
0
大多数情况下,程序不允许访问地址为0的内存,因为该内存是操作系统保留的。(其他100、1000大多也不能访问)
但是内存地址0有特别重要的意义,标明该指针不指向一个可访问的内存位置。
按照惯例,如果指针是空值,则假定它不指向任何东西。
如何检查空指针
if(p) /* 如果 p 非空*/
if(!p) /* 如果 p 为空*/
指针的运算
指针的加减法,就是指针向前/向后移动sizeof(数据类型)个字节。
int ids[] = { 78, 90, 23, 65, 19 };
//ids和&ids[0]输出的地址相同,ids就是数据的首地址
printf("%#x\n", ids);
printf("%#x\n", &ids);
printf("%#x\n", &ids[0]);
int *p = ids;
printf("改变前p的值:%#x\n", p);
p++;
printf("改变后p的值:%#x\n", p);
打印结果
0x8ff9c8
0x8ff9c8
0x8ff9c8
改变前p的值:78
改变后p的值:90