标签:
在学习指针之前,首先应该了解一些东西:
内存是什么?
从硬件形态上说,内存就是一条形物理设备,从功能上讲,内存是一个数据仓库,程序内在执行前都要被装载到内存中,才能被中央处理器执行。内存是由按顺序编号的一系列存储单元组成的,在内存中,每个存储单元都由唯一的地址,通过地址可以方便地在内存单元中存储信息。在计算机中,一切信息都是以二进制数据的形式体现的,每个内存单元的容量是1B,即8bit(8个0、1二进制位)。
1、取地址运算符&, 间接运算符*
&运算符: 取地址运算符,&m即是变量m在内存中的实际地址。
*运算符: 指针运算符 (通常称为间接引用运算符),它返回其操作数 (即一个指针)所指向的对象的值.
int num = 10;
printf("%d , %x", num, &num);
*(&num) = 100;
printf("%d , %x", num, &num);
&num 是直接访问变量num的地址,而 *(&num)中*则是间接访问
直接访问: 按变量地址存取变量值。
间接访问: 通过存放变量地址的变量去访问变量。
2、指针变量的声明与初始化
在声明一个指针后,编译器并不会自动完成其初始化,此时,指针的值是不确定的,也就是说,该指针指向那块内存单元是完全随机的。
如果在指针变量声明之初确实不知道该将此指针指向何处,最简单的方式是将其置“0”,C语言中提供了关键字NULL
其基本形式为:
类型* 指针变量名;
int *pNum=NULL;
值为NULL的指针称为空指针,这意味着,指针并不指向任何地址。在头文件 stdio.h 中,NULL 定义为常量。
3、指针变量在使用之前必须进行初始化。因为指针未初始化,指向一个随机的地址,很有可能是其他程序正在使用的内存地址,如果去修改它,就会导致程序崩溃。
int num=100;
int * p;
p = num; //这样是错误的,可以编译,运行报错,会把100当做一个地址
p = # //正确
4、指针只是一个地址,大小是固定的,就是四个字节。
int *p1;
double *p2;
char *p3;
sizeof(p1); //结果为 4
sizeof(p2); //结果为4
sizeof(p3); //结果为4
5、 指针和地址的区别
两个要点:一、指针是个量,对应着一块内存区域,二,指针存储的信息是某个内存单元的地址。
比如: int num=10;
int *p=#
&num 是一个地址,是一个常量
而p是一个指针变量,可以存储一个地址
比如300500是一个地址,
int *p=(int *)300500 是一个指针,p存储的是地址,指针有类型,从哪里开始,长度是多少,从哪里结束,得知了类型以后,就知道这片内存数据是如何解析
标签:
原文地址:http://www.cnblogs.com/Sandglass/p/4932112.html