C *&的用法
基础知识
C语言中,*
和&
是操作指针的符号。什么是指针呢,首先我们先要了解内存的概念。
一台基本的电脑是由:输入输出设备(键盘、鼠标、显示屏,但是没有他们电脑也是可以工作的)、CPU、内存、硬盘、显卡组成的。
- CPU:大家都知道它是中央处理器,是电脑的核心,是计算机的大脑。
- 硬盘:它是记录数据用的,它是一种储存器,准确的说是非易失性储存器,简而言之就是我们的数据能在硬盘中长期保存,不会因为断电而丢失。
- 内存:其用处和硬盘差不多,但是区别在于它是一种易失性储存器,一旦断电,储存在里面的数据就都将丢失,不过它的速度却比传统的机械硬盘快20多倍,因此存放一些程序要临时用到的变量就非常合适。
我们知道,C语言的变量是存在内存里面的,而内存被分为了好多个基本单位,地址
就是赋予每个基本单位的唯一标号。简单的说,一个地址对应了一块小内存。
当我们定义变量时
int a = 10;
这样我们就在内存中开扩了一块空间,并把这块内存中存入数据10。
有前面关于地址
的概念之后,我们就能想到,如何读取到该变量的地址呢?
而符号&
便是这个含义。
&
取址符号:用于将一个变量的地址取出来。
例子:
#include <stdio.h>
int main()
{
int a = 10; // 定义一个变量,并赋值为10
printf("%p",&a); // %p用于打印地址,而后面的&a就是用来取出a的地址的。
}
根据例子,我们便能理解&
(取址符号)的含义了。
但是&
还有另一个含义,那便是引用。
引用,其实我们可以这么理解,它可以是一个变量的别名,也就是说一块内存有两个名字(不是地址,地址只能有一个,我指的是变量名字)。下面的那个例子很好的说明了这一切:
#include <stdio.h>
int main()
{
int a = 10; // 先定义a变量
int &b = a; // 把a引用到b来
// int &c; // 这句话错误,使用引用是必须初始化,指定其引用的对象。
printf("a = %d, b = %d\n", a, b); // 很显然,他会输出a = 10, b = 10
a = 20; // 我们对a进行赋值操作
printf("a = %d, b = %d\n", a, b); // 他输出了a = 20, b = 20
b = 30; // 同样的,我们在对b进行赋值操作
printf("a = %d, b = %d\n", a, b); // 他输出了a = 30, b = 30
/// 这也就说明,a和b是绑定的,动其中的一个,那么另一个一定也会随之改变。
/// 那么也就可以说b是a的一个别名,另一个名称。
printf("&a = %p, &b = %p\n", &a, &b); // 输出的地址是一样的
return 0;
}
注释已经写的很详细了,相信大家一定能看懂的。
而实际上,我们也能这么理解。通过上面的例子的最后一句输出可以看出a变量和b变量同时指向了同一块内存,他们的地址实际上是相同的,所以,我们在对a变量进行更改的时候就是指操作了这块内存的内容,而操作b时,我们动的也是这块内存,所以他们才会表现出这样的效果。
*
取值符号:当我们有了一个地址的时候,我们又想知道这个地址对应的内存里存的是什么呢,那么取值符号就可以达到这个目的了。
下面的例子就能解释这个意思了:
#include <stdio.h>
int main()
{
int a = 10;
printf("%d",*&a); // 我们先用&a将a变量的地址取出来,然后我们再在最前面加上*取值符号,这时候输出的便又是我们的数字了。
return 0;
}
但是这样是不是很没用,感觉特别鸡肋?
所以我将介绍*
的另一个用法。
int a = 10;
int* b = &a;
我们之前了解了地址的概念,但是地址本身也是可以存到变量当中的,而b变量便是一个指针变量,用于存放指针(地址)。
这样说不好理解,不如这样讲吧。学过变量类型我们知道有char
, int
, long
, float
, double
等几种常见的类型,那么定义变量时就会开启一块内存空间来储存。那么每种类型也对应着一种类型的内存空间,而int
对应的指针变量类型便是int*
,double
对应的则是double*
,其实就是在每种类型后面加一个*
就行了。
而指针类型的变量存的就是地址
,所以我们定义指针变量便可以像例子中那么写了。
不过,定义指针变量的方法还有一个,并且我更推荐大家这么写,因为区分度较高:
int a = 10;
int *b = &a; // 推荐使用这种写法
int* c = &a;
其实就是空格的位置变了下。
这样一来,*&就便有了意义。
由于b和c变量存的是a的地址,那么我们用b和c去对啊进行赋值的时候也有些不一样,先要用*
对b或c变量进行取值,把a取出来之后才能对a进行赋值操作。详情请看例子。
*b = 20; // 这句话相当于进行了a = 20;操作
顺便题下,初学者在学输入语句scanf("%d",&a);
时往往无法理解&
的含义,而现在应该能懂了吧,人家是取出a的地址,然后用*
取出值来修改啊。
在函数中的应用
(未完待续……)