地址与取地址符
变量的地址
变量的基本属性
- 包括以下内容
- 变量类型
- 变量名
- 变量值
- 变量存在于内存中位置
我们声明变量(如int number)时,程序根据变量的类型(如int)分配一块内存,并将这块内存的开始地址和变量名关联起来。
或者,我们可以试着将变量想象成一个盒子,不同类型的变量就是装着不同类型东西的盒子。除了类型之外,变量还有一个属性就是地址(address),我们可以把这看作是贴在盒子上的一种标签。如果你把这个地址给到了张三,张三就可以利用这个地址来找到“贴着对应标签的盒子”-------对应的变量。
使用变量
当然,对于变量的使用我们可以非常容易。使用变量名我们就可以访问和输出变量的值,举个例子:
printf("%d",number);
也可以直接修改变量的值,如:
number=100;
使用变量的地址
在格式化输入中,我们了解到有取地址符&。所以,对于一个int类型的变量number,当我们写number的时候得到的是变量的值(即盒子里的东西),而当我们写&number的时候我们得到的就是,变量number的地址(即盒子上的标签)。举个例子:
使用取地址符可以得到内存地址
scanf("%d",&number);
通过&number得到变量number的内存地址,可以在读入值时确认要读入的内存位置。也可以用%p格式占位符将内存地址输出出来。
printf("%p",&number);
所以,在C语言中地址值也可以被认为是一种特殊类型的值。C语言中也设计了专门类型的变量,对地址的值进行存储。
保存内存地址的变量
我们声明一个可以存储整数型值的变量number,会写成int number;,而我们现在希望有一个变量p_number,可以存储整数型值的变量的地址,我们就需要写成int *p_number
。
保存内存地址的变量的基本属性
- 包括以下几个部分
- 存储的内存地址对应的变量类型
- 变量名
- 变量值(另一个变量的内存地址)
- 变量存在于内存中的位置(自己的变量地址
我们声明保存内存地址的变量(如int *p_number
)时,*
标记出这个变量是用来存储内存地址的变量,而在*
前则是存储的内存地址对应的变量类型。与一般变量相同,这个变量声明后也会有自己的内存地址,声明变量后这块内存的开始地址也会与这个变量名关联到一起。
变量之间的关联
当我们有了这样一个变量p_number之后,我们可以将整数型变量number的地址放到变量p_number里面,这个过程我们可以通过将变量p_number赋值成“取变量number地址”的形式来完成-----------p_number=&number;
。
一样的,我们也可以通过float *q;
声明一个变量,来存储浮点数类型的变量float n的地址值。我们也可以通过unsigned int *k;
来声明一个变量,用来存储无符号整数类型的变量unsigned int a的内存地址。
不难发现,将*
标记加在类型后标记了的变量是用来存储内存地址的变量而不是普通数值。
用盒子的比喻理解清楚,变量,变量的值,变量的地址,特殊的用于存储地址的变量,这些不同的概念,相信应该很容易吧。
我是Panic,一个热爱学习和分享的人,一起加油。