C语言

C *&的用法

2019-07-31  本文已影响2人  Void_Caller

基础知识

C语言中,*&是操作指针的符号。什么是指针呢,首先我们先要了解内存的概念。

一台基本的电脑是由:输入输出设备(键盘、鼠标、显示屏,但是没有他们电脑也是可以工作的)、CPU内存硬盘显卡组成的。

我们知道,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的地址,然后用*取出值来修改啊。

在函数中的应用

(未完待续……)

上一篇下一篇

猜你喜欢

热点阅读