首页 > 安全资讯 >

我也要学C语言-第十三章:复合数据类型—指针与指针变量(一)

11-06-02

指针的定义:   指针是一种复合数据类型。它是对一类变量的描述。就像街道门牌的号码!例如有一条X的街道,它有1024栋房子。那么每栋房子可以用X[0-1024]来索引。假如我们每栋房子都可以保存一个整数值,那么X街就有1024个不同的整型变

指针的定义:

  指针是一种复合数据类型。它是对一类变量的描述。就像街道门牌的号码!例如有一条X的街道,它有1024栋房子。那么每栋房子可以用X[0-1024]来索引。假如我们每栋房子都可以保存一个整数值,那么X街就有1024个不同的整型变量。而且每个变量都是可以使用房屋的编号去访问。其实这里的每栋房子的编号就是指针!我们把X换做是内存,每栋房子看成一个独立的内存空间,那么就可以这么下结论,一个指针就是值为其他内存对象地址的数据类型。

指针的本质:

  其实指针的本质是对内存地址的抽象,抽象内存地址的方式有多种,只要你能通过一种方式达到对内存对象进行访问,那么这种方式就可以叫做指针。比如,我要找1个人,我通过电话本上的号码找到他,这时,这个电话号码叫指针(电话本叫指针变量)。又比如,我通过GPS找到他的地址坐标找到他,那么这个地址坐标叫指针(这个GPS叫做指针变量)。

指针变量:

  存放一个值为其他内存对象地址的变量叫指针变量。

指针变量的声明要点:

  如果我们申明一个指针变量 int *p,但是刚开始我们还无法确定需要给p什么值的时候我们必须给p赋值NULL; NULL的实质是这样的:#define NULL ((void *)0) 强制转换的0.因为指针变量在debug环境下默认初始值是全C,release环境下是上次废弃的值。

指针与地址的区别:

  地址是表示内存的编号信息;指针有2个信息,1个是地址信息,1个是此地址的解释信息。比如:int *p表示此指针指向的地址的内存对象用int去解析.float *q表示此指针指向的地址的内存对象用float去解析。

C语言的直接引用:

   我们通过变量名来直接引用变量。例如a=123.编译器会自动将变量名转换成变量的存储地址。然后再将123放入变量a的存储空间中。

C语言的间接引用:

  首先将变量的地址存放在一个变量(指针变量),然后再通过存放变量的地址的指针变量来引用变量。

直接引用和间接引用的代码事例:

#include <stdio.h>void main(){    int a, b;    int *p;//定义指针变量p        p = &b;//将变量b的地址存放在变量p中    a = 3;//直接引用变量a    *p = 5;//间接引用变量b}
关于间接引用的回忆:

  大家还记得我们前几天我们学习的数组名传参的内容吗?我们看到复制过去的副本是数组的首地址。在我们的实现函数里是针对这个地址再寻址。

关于数组名的思维的发散:

  我们能不能对数组名取地址呢?!

  其实对数组名取地址是没有意义的。数组名是一个地址常量,比如123,321这样的常量在内存中是没有内存空间的。只有变量才有内存空间。常量被集成到指令里,没有专门保存它们的内存空间。

  为什么常量进行函数传参时常量会有内存空间呢?!

  比如:go(123).因为这个时候需要有个副本来保存参数。

  严格来说,只要程序运行起来了,都要占空间。只是常量没有占到数据保存的区域里,而是集成到指令里去了。

 

相关文章
最新文章
热点推荐