文/Edward

当我们将一个指针变量定义好之后,接下来需要考虑的问题就是如何来使用这个指针变量了。前面学习普通变量的时候,我们知道,一个变量的操作其实就是分成读和写两个步骤。而指针变量在平时使用的时候,也是主要分成读和写两个操作步骤,不同于常规变量的是,指针变量的赋值运算其实是写入一个普通变量的地址,我们将这一个过程称为指针变量的"指向操作"。而对指针变量读取的时候,由于指针变量存放的是某一个变量的地址,而读取某一个地址这个操作往往是没有意义的,因此在指针变量读取的时候,大多数情况我们都是读取指针变量指向的那个变量里面的内容。

指针变量的指向操作,其实就是将定义好的一个指针变量指向某一个变量或者内存区域,其方式为:"数据类型 *指针变量名 = &指向的变量;"。当然也可以先定义指针,再将其指向某一个变量,即:

"数据类型 *指针变量;

指针变量 = &指向的变量;"

在使用时,一定要注意上面"*"号的用法差异。还需要注意的是,一个指针变量只能指向与其数据类型相同的变量。

一旦一个指针指向某一个变量之后,操作这个指针变量就如同操作其指向的那个变量了。在操作时,我们使用"*指针变量名"的形式进行读取和写入,就等同于对指针所指向变量的读和写操作。指针变量指向变量的读取如图1所示。

图1 指针变量指向变量的读取

同时,指针变量指向变量的赋值如图2所示。

图2 指针变量指向变量的赋值

由图1和图2中我们可以看出,当指针变量p指向了变量a之后,使用*p进行操作,就如同在操作变量a。以上就是指针变量的操作,非常简单。

需要注意的是,当一个指针被定义好之后,一定要对其进行初始化,即指向某一个变量的地址,没有指向任何变量的指针被称为"空指针",空指针无法去做任何操作,一旦对空指针进行赋值,那么编译出来的程序将会无法使用,如图3所示。

图3 指针未指向变量输出错误

这种没有指向任何变量的指针被称为"野指针",注意不是"空指针",空指针和野指针是不一样的指针,野指针是非法的,空指针是合法的,关于空指针和野指针的区别为:

野指针是不知道指向什么地方的指针,它的出现主要原因是没有对指针进行初始化,或者指针所指向的内存块被释放之后,没有将该指针设置成空指针。

空指针是指指向NULL的指针,NULL为C语言定义的宏,为0,关于空指针我们后面会详细讲解。

我们前面说过,一个变量的地址是当我们在定义这个变量时由编译器主动随机分配的,因此如果我们在定义一个指针变量之后,随意地对其赋值,对于用户来说,我们不清楚哪一块内存地址可用,那一块不可用。那么这样操作是不是就是不合法的呢?其实并不是,比如我们在做单片机的时候,某一个外设的地址你可以从数据手册上面查到,那么我们此时要定义一个指针来指向这个地址,以便给后续的程序使用,那么这种情况下,我们势必需要显示地将一个地址赋值给这个指针变量。反过来说,指针就是由于可以任意地指向任何地方,所以一旦使用不当,比如将一个指针指向一些受保护的内存块并且修改这一块内容,那么会引起一些不可估量的错误。

如果对一个指针贸然地赋值一个常量,那么编译器会不知所措,在这种不知所措之下,编译器只会报一个警告,这个警告的中文意思就是,将一个int类型的变量赋值给一个(int *)类型的变量,如图4所示。

图4 给指针赋值一个常量

正确的做法是,我们需要将这个常量强制转换成一个指针类型,关于强制类型转换其实很简单,只需要将这个变量或者常量前面用括号加一个你所需要转换的类型即可。如图5所示。

图5 给指针赋值一个常量地址

现在我们来做一个实例,先定义一个变量a,假设这个变量a的地址是我们硬件某一个外设的地址,我们可以先编程获取其地址,如图6所示。

图6 获取某一个变量的地址

接着,我们来定义一个指针变量,并且显示地将这个地址赋值给这个变量,接着,对这个指针所指向的内存进行赋值,我们来看看最终变量a里面的内容是否会跟着改变。既然模拟的是硬件,那么此时有个小提示需要注意,我们一定要用"volatile"关键词来修饰这个内存区域。如图7所示。

图7 指针指向外设模拟

通过这个实验我们可以看出,只要指针使用合理,对它进行地址赋值是可以很方便地去使用某一个硬件外设的。

以上就是指针的简单应用,接下来的内容,我们正式开始学习指针。

checkbox未赋值时获取value是on_C语言中的指针——指针的赋值和指向相关推荐

  1. c语言如何赋值空字符串,c语言中如何给字符串数组赋值

    c语言中如何给字符串数组赋值 1.问题 这是我写的 struct student { int x; char name[10]; }; void main() { student st: st.nam ...

  2. R语言中如何给向量改变赋值

    R语言中如何给向量改变赋值 一.创建向量 二.访问向量特定位置 三.改变向量特定位置赋值 结果 一.创建向量 a<-c(rep("冬季盛宴",5),rep("盛宴& ...

  3. C语言中字符串的定义和赋值

    和java不同,在C语言中没有string类型,需要用char型数组来定义.(在java中的string底层也是适用的char型数组) 1. 先定义后赋值 定义: char string[10]; / ...

  4. python语言中、用来表示赋值的符号是_第二章Python语言基础知识

    第二章Python语言基础知识 2.1 Python语言基础知识 2.1.1标识符与关键字 在Python语言中,对程序中各个元素命名加以区分,这种用来标识变量.函数.类等元素的符号称为标识符. Py ...

  5. c语言自动获取系统时间,C语言中如何获取系统时间?

    1 使用time_t time( time_t * timer ) 精确到秒 函数名: time 头文件:time.h 函数原型:time_t time(time_t * timer) 功能: 获取当 ...

  6. C语言中字符串的两种赋值方法 - 指针赋值和数组赋值

    在C语言中,字符串的赋值主要有两种方法,第一种是通过指针的方式直接赋值,第二种是通过数组直接赋值.当然在C++ 中也是可以的,C++是C的超集嘛,在C++中包含了C的所有功能: 1.指针式赋值. 通过 ...

  7. C语言中的结构体指针赋值问题

    在对数组或者接收到的数据进行赋值时,往往因为结构体中含有指针而无法获取接收到的数据,那么如何才能获取结构体中的指针指向的内容呢?这就涉及到两个部分的内容. 1.通过memcpy()赋值或者对数据进行结 ...

  8. R语言编程 第一讲 变量与赋值

    R语言编程 第一讲 变量与赋值 R语言的变量名 赋值符号 <- 与 = 的区别 赋值符号 <- 的更多细节 Copy-on-Modify与Modify-in-Place 函数调用 列表 数 ...

  9. c 语言定义2维字符串数组赋值,二维数组赋值字符串 c 语言 二维字符串数组赋值问题...

    C语言中二维字符数组应该怎样赋值? c语言二维数组如何定义字符串????急... 二维字符数组的定义格式为:char 数组名[第一维大小][第二维大小]; 例如:char c[3][10]; //定义 ...

最新文章

  1. [luogu3760 TJOI2017] 异或和(树状数组)
  2. mysql游标进阶_mysql进阶(三)游标简易教程
  3. Python程序练习题5.1-输出更大的田字格。
  4. ubuntu etc目录下配置文件profile和profile.d的区别?(文件解析)
  5. 【摄影测量原理】第二章:单幅影像解析基础
  6. linux grep命令 例子,14个grep命令使用例子
  7. wpf学习笔记二 深入学习 xaml
  8. java对redis的基本操作(初识)
  9. 20190823:(leetcode习题)实现 strStr()
  10. 【转】.NET Interop入门-P/Invoke和Reverse P/Invoke
  11. 【mybatis】学习笔记之conf.xml与mapper.xml配置
  12. 二、ReactDOM.render()
  13. 安卓系统和安卓服务器地址,给安卓应用配置服务器地址
  14. java教程 电子书_java教程合集(25本)
  15. 项目接力:售前、售中、售后
  16. 一文看不懂方差和标准差
  17. eNSP交换机配置IP
  18. 四川大学 计算机复试分数线,2015年四川大学考研复试分数线已公布
  19. 记录一次实战破解无线wifi——Aircrack-ng
  20. 回复:程序员如何做SOHO接私单

热门文章

  1. IntelliJ IDEA设置默认换行符
  2. 网络犯罪:令牌化和区块链将终结数据盗窃行为?
  3. centerOs-6.8的安装
  4. git中找回丢失的对象
  5. mysql----Linux下安装
  6. :link,:visited,:focus,:hover,:active详解
  7. 内网端口 转发 穿透 工具简介
  8. premiere pr 视频截图
  9. golang json数据的处理 动态key 动态字段
  10. linux c++ 警告: ISO C++ forbids converting a string constant to char*