指针知识(一) 直接引用、指针定义、初始化、运算符

指针

本文目录

直接引用

1. 直接引用意思就是通过变量名直接使用变量数据;
char a;
a = 10;
 
2. 看上去是很简单,其实程序内部是怎么操作的呢?
其实,程序对变量的读写操作,实际上是对变量所在的存储空间进行写入或取出数据。就上面的代码而言,系统会自动将变量名a转换为变量的存储地址,根据地址找到变量a的存储空间,然后再将数据10以2进制的形式放入变量a的存储空间中。
 
 
3. 通过变量名引用变量,由系统自动完成变量名和其存储地址之间的转换,称为变量的"直接引用"方式
 

一、什么是指针?

1.我们已经知道,"直接引用"是直接通过变量名来读写变量

2.C语言中还有一种"间接引用"的方式(以变量a为例):首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值。这就是"间接引用"。

如果程序通过"间接引用"的方式来修改a的值,可以这样做:先根据 变量名b 获取 变量b 的地址ffc2,取出变量b中存储的内容ffc1,也就是变量a的地址,再根据变量a的地址ffc1找到a的存储空间,然后修改里面的数据。

3.总结一句:用来存放变量地址的变量,就称为"指针变量"。在上面的情况下,变量b就是个"指针变量",我们可以说指针变量b指向变量a。


二、指针的定义

一般形式:类名标识符 *指针变量名;

int *p;

float *q;
  • "*"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分
  • 前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的变量

三、指针的初始化

1.先定义后初始化

复制代码
1 // 定义int类型的变量a
2 int a = 10;
3 
4 // 定义一个指针变量p
5 int *p;
6 
7 // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a
8 p = &a;
复制代码

注意第8行,赋值给p的是变量a的地址&a

 

2.在定义的同时初始化

复制代码
// 定义int类型的变量a
int a = 10;

// 定义一个指针变量p
// 并将变量a的地址赋值给指针变量p,所以指针变量p指向变量a
int *p = &a;
复制代码

 

3.初始化的注意

指针变量是用来存放变量地址的,不要给它随意赋值一个常数。下面的写法是错误

int *p; 
p = 200; // 这是错误的

不能用尚未定义的变量给指针变量赋值
int *p = &a;
int a;  // 这是错误的

变量的数据类型必须要与指针变量指向的数据类型一致
float m;
int *p = &m; // 这是错误的

除0之外,一般不把其他整数作为初值赋给指针变量。程序运行期间,变量的地址是由计算机分配的,当一个正数为一个指针变量赋初始值后,可能会造成
难以预料的后果。当用0对指针变量赋值时,系统会将该指针变量初始化为一个空指针,,不指向任何对象。


四、指针运算符

1.给指针指向的变量赋值

复制代码
 1 char a = 10;
 2 printf("修改前,a的值:%d\n", a);
 3 
 4 // 指针变量p指向变量a
 5 char *p = &a;
 6 
 7 // 通过指针变量p间接修改变量a的值
 8 *p = 9;
 9 
10 printf("修改后,a的值:%d", a);
复制代码

当程序刚执行完第5行代码时,内存中大概的分布情况是这样的

a值是10,p值就是变量a的地址ffc3。

注意下第5、第8行,都有个"*",它们的含义是不一样的:

(1) 第5行的"*"只是用来说明p是个指针变量

(2) 第8行的"*"是一个指针指向运算符,这里的*p代表根据p值ffc3这个地址访问对应的存储空间,也就是变量a的存储空间,然后将右边的数值9写入到这个存储空间,相当于 a = 9;,于是内存中就变成这样了

输出结果为:,可以发现,我们通过变量p间接修改了变量a的值。

 

2.取出指针所指向变量的值

指针运算符除了可以赋值之外,还可以用于取值

复制代码
1 char a = 10;
2  
3 char *p;
4 p = &a;
5 
6 char value = *p;
7 printf("取出a的值:%d", value); 
复制代码

输出结果:第6行的*p的意思是:根据p值(即变量a的地址)访问对应的存储空间,并取出存储的内容(即取出变量a的值),赋值给value

 

3.使用注意

在指针变量没有指向确定地址之前,不要对它所指的内容赋值下面的写法是错误

int *p; 
*p = 10; //这是错误的


应该在指针变量指向一个确定的变量后再进行赋值。下面的写法才是正确

// 定义2个int型变量
int a = 6, b;

// 定义一个指向变量b的指针变量p
int *p;
p = &b;

// 将a的值赋值给变量b,   因为p指向的就是b的存储地址
*p = a;


资料来源(自己进行了相关修改):
http://www.cnblogs.com/mjios/archive/2013/03/16/2963645.html
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值