C语言学习总结7——指针的相关概念


1、指针变量的内容

int a = 112, b = -1;
float c = 3.14;
int *d = &a;
float *e  = &c;

变量d和e的声明。它们都被声明为指针,并用其他变量的地址予以初始化。指针的初始化是用&操作符完成的,它用于产生操作数的内存地址
在这里插入图片描述
图中上面是地址,下面是对应地址所储存的值;下图中使用a、b等字母表示对应的地址。
在这里插入图片描述

d和e的内容是地址而不是整型或浮点型数值。 事实上,从图中可以容易地看出,d的内容与a的存储地址一致,而e的内容与c的存储地址一致,这也正是我们对这两个指针进行初始化时所期望的结果。区分变量d的地址(112)和它的内容(100)是非常重要的。
在这里插入图片描述

2、 间接访问操作符

通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针。这个用于执行间接访问的操作符是单目操作符   * 。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、未初始化和非法的指针

int *a;
...
*a = 12;
这个声明创建了一个名叫a的指针变量,
后面那条赋值语句把12存储在a所指向的内存位置

但是究竞a指向哪里呢?我们声明了这个变量,但从未对它进行初始化,所以我们没有办法预测12这个值将存储于什么地方。从这一点看,指针变量和其他变量并无区别。如果变量是静态的,它会被初始化为0;但如果变量是自动的,它根本不会被初始化。 无论是哪种情况,声明一个指向整型的指针都不会“创建”用于存储整型值的内存空间。所以,在你对指针进行间接访问之前,必须非常小心,确保它们已被初始化!

4、NULL指针

标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。

对指针进行解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西。因此,对一个NULL指针进行解引用操作是非法的。在对指针进行解引用操作之前,你首先必须确保它并非NULL指针。

5、指针、间接访问和左值

涉及指针的表达式能不能作为左值?如果能,又是哪些呢?对优先级表格进行快速查阅后可以发现,间接访问操作符所需要的操作数是个右值,但这个操作符所产生的结果是个左值

指针变量可以作为左值,并不是因为它们是指针,而是因为它们是变量。
对指针变量进行间接访问表示我们应该访问指针所指向的位置。间接访问指定了一个特定的内存位置,这样我们可以把间接访问表达式的结果作为左值使用。在下面这两条语句中,

*d = 10 - *d;
d = 10 - *d;

第1条语句包含了两个间接访问操作。右边的间接访问作为右值使用,所以它的值是d所指向的位置所存储的值。左边的间接访问作为左值使用,所以d所指向的位置把赋值符右侧的表达式的计算结果作为它的新值。
第二条语句是非法的。

6、指针、间接访问和变量

*&a = 25所表达的意思是把25赋值给a。
首先,&操作符产生变量a的地址,它是一个指针常量。接着,  *   操作符访问其操作数所表示的地址。在这个表达式中,操作数是a的地址,所以值25就存储于a中。

7、指针常量

让我们来分析另外一个表达式。假定变量a存储于位置100,下面这条语句的作用是什么?

*100 = 25

它看上去像是把25赋值给a,因为a是位置100所存储的变量。但是,这是错的!这条语句实际上是非法的,因为字面值100的类型是整型,而间接访问操作只能作用于指针类型表达式 。如果你确实想把25存储于位置100,你必须使用强制类型转换。

*(int *)100 = 25;

强制类型转换把值100从“整型”转换为“指向整型的指针”,这样对它进行间接访问就是合法的。如果a存储于位置100,那么这条语句就把值25存储于a。

这个技巧唯一有用之处是你偶尔需要通过地址访问内存中某个特定的位置,它并不是用于访问某个变量,而是访问硬件本身。 例如,操作系统需要与输入输出设备控制器通信,启动I/O操作并从前面的操作中获得结果。在有些机器上,与设备控制器的通信是通过在某个特定内存地址读取和写入值来实现的。但是,与其说这些操作访问的是内存,还不如说它们访问的是设备控制器接口。这样,这些位置必须通过它们的地址来访问,此时这些地址是预先已知的。

8、指针的指针

int a = 12;
int *b = &a;

内存分配示意图如下:
内存分配

假定有第三个变量,为c
c = &b;

内存分配示意图如下:
在这里插入图片描述

问题是:c的类型是什么?显然它是一个指针,但它所指向的是什么?变量b是一个“指向整型的指针”,所以任何指向b的类型必须是指向“指向整型的指针”的指针,更通俗地说,是一个指针的指针。

c的声明方法:
int **c;

在这里插入图片描述
在这里插入图片描述

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值