C语言 - 指针

什么是指针

指针存储的是变量的内存地址。

申明指针的方式

通过类型*进行声明,比如

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

其他

参考文档
http://www.runoob.com/cprogramming/c-pointers.html

猜你喜欢

转载自blog.csdn.net/ethanco/article/details/78598704