在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占4个单元,字符量占1个单元等,为了正确地访 问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单 元。
内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的
内存单元,所以通常也把这个地址称为指针。
总结:对于一个内存单元来说,单元的地址即为指针,其中存放的数据才 是该单元的内容。
终极精华版总结:
变量的地址就叫做指针,指针就是地址
2、变量的存取方式
存取方式分为两种:
直接存取:
变量的赋值和取值(通过变量名进行存取值)
int a = 3;
间接存取:
通过指针(地址)间接操作完成
指针变量的概念和定义
1、指针变量
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
2、定义一个指针变量
对指针变量的定义包括三个内容:
1)指针类型说明,即定义变量为一个指针变量;
2)指针变量名;
3)变量值(指针)
其一般形式为: 类型说明符 *变量名;
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指 向 的变量的数据类型。
例如:
int *pi;
long *pl;
float *pf;
char *pc;
注意:
1)在定义指针时,“*”号表示定义的变量是指针变量,变量的值只能存放地址。
2)一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。
3)指针也可以被声明为全局、静态局部和局部的。
指针变量的初始化
1、指针变量只能赋值地址或空
指针变量最大的特点是:这个指针变量只能存储同类型的普通变量的地址
因此:
不能给指针变量赋值为其他非地址类型的常量数据
不能给指针变量赋值为其他非地址类型的变量数据
如果强行赋值其他类型的数据,编译器不会报错,但是会弹警告,运行时可能会造成不可预
知的严重错误
但是,也可以让指针变量赋值为空,即赋值为NULL或者0,代表什么都不指向
如:
2、如何给指针变量赋值地址
如果我们想用指针变量去指向某个变量,那么怎么得到这个变量的地址呢?
回顾之前的scanf,我们会经常用到一个符号:“&”,这个符号就是用来取地址的
所以,如果要给指针变量初始化,有如下两种:
1)先申明,再赋值
int num = 10;
int *p;
//让指针变量p指向num所在空间
p = #
2)申明的时候就初始化
int num = 10;
//申明的时候直接赋值地址
int *p = #
特别注意:
申明某个类型的指针变量后,就应该赋值为某个类型变量的地址,如果赋值其他类型,编译器不会报错,但是运行时可能会产生不可预知的严重后果!
特别注意again:
int *p;
这个指针变量的变量名叫"p"而不叫"*p","*"号只是用来告诉编译器申明的这个变量不简 单,是一个指针变量!"int *"这才是一个整体,表示int型指针
最后注意: 初学者最容易忘记在给指针变量赋值时,取地址忘记写&符号
指针变量的使用
1、输出地址 如果要输出地址(或者说指针),那么需要用格式控制符:%p
2、通过指针变量去访问一个变量 语法:*指针变量名
如:
由此我们可以发现 ,在上例代码中 *p = 30; 相当于是执行了 num = 30;
千万要注意:
访问指针变量时加星号和不加星号的区别:
int num;
int *p = #
1.加星号代表,是访问它所指向的空间里面的值(访问别人的妹子) *p 相当于 num;
2.不加星号代表,是访问它自己的空间里面的值(访问自己的黄脸婆)p 就是自己里面存的值