C语言指针 * 和 & 总结

C语言中指针 * 和 & 的总结

前言

最近复习了C语言中指针,在网上看了一些资料,发现很多人在解释指针的时候提到了“引用”这个概念,但是C语言是没有这个概念的,大概是在学习时是用来cpp的来学习。所以在这里有一点误会。C语言中是没有引用这个概念的。如果大家在刚开始学习c语言时,尽量用GCC编译器。以免混淆一些概念。

指针

例如在有:

    int a = 10;
    int* p = &a;

在定义一个整型变量a后 ,定义一个整型指针p指向a,在这里p中存放的是存放变量a的地址。对于指针,谭浩强的书中举得例子就很容易让人理解。 储存就像一栋楼房,然后系统将储存划分为“页”就像是一栋楼里有很多层。然后每层又有很多房间。对应每页有很多的储存单元。 当我们需要定义一个变量时,就是划分出了一部分储存单元来让我们使用,具体的大小是由变量的类型决定的。
在上面这个例子中,我们定义了一个整型变量a,于是系统给了我们四个字节的储存单元。这四个储存单元是有一个“地址值”的,用来让我们找到我们存的“10”是在哪里。整型指针p,就是存储的就是我们a的地址。在楼房的比喻中,就像我们买下了一个房子。房子是有门牌号的。p中的内容呢,就是我们房子的门牌号。
当然,可能在一个变量中,不止拥有一个储存单元。而每个储存单元都有一个地址,在这个时候,指针中存放的值是变量的首地址。而指针一共需要访问几个单元。是由指针的类型决定的,比如定义的指针p为整型,那么就会访问四个字节。定义的指针是长整型,那么就会访问八个字节。

* 与 &

当我们在使用号时,就像我们需要网购一样。快递员是不认识我们的。但是他可以通过留下的地址将快递送过来。这个过程就是p 。意思就是可能这个人并不认识我们,但是他可以通过地址找到我们。
在上面的例子中,p就是a的地址,p 就是通过a的地址来访问a的内容。所以在输出p时,就等同于输出变量a。
而&的意识是取地址。就像我们认识的人。他们给我们寄快递。但是他们并不知道我们的具体地址。于是就要问我们。在上面的实例中,就是&a。就可以得到a的地址。

    int a = 10;
    int* p = &a;
    printf("%p\n",&a);
    printf("%p",p);

输出结果为C语言指针 * 和 & 总结_第1张图片

其他类型的指针

指针类型其实有很多。不仅仅局限于我们基础的几种数据结构。(char int long double)等等。
还有像 二级指针 ->指向指针地址的指针
数组指针 ->指向一个数组的指针

ps

在我们将一些功能封装成函数时,例如交换两个变量的值。

void Swap(int a,int b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

这样写是不行的。因为当系统调用函数时,会给函数的形式参数重新划分一片内存。我们这时候在函数内执行操作。其实是交换了新的两个变量的值。而我们真正想要交换的两个变量是没有改变的。而这两个形式参数的内存又会在函数执行完后释放掉。所以就不会有什么变化了。
我们将程序修改成这样。

void Swap1(int* const a, int* const b)
{
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}

通过指针来间接访问我们想要交换的变量,同样的。当系统调用函数时,也会为这里的形式参数开辟一些新的空间。但是这里我们传递给函数的是我们想要改变的变量的地址。我们通过地址间接访问变量。至于是谁拿到了我们的地址。这是无所谓的。因为在进程中我们这个变量的地址是没有改变的。
在执行下面的代码时:

int main()
{

    int a = 10;
    int b = 5;
    printf("%d----%d\n", a, b);
    Swap(a,b);
    printf("%d----%d\n", a, b);
    Swap1(&a,&b);
    printf("%d----%d\n", a, b);
   
}

执行结果为:
C语言指针 * 和 & 总结_第2张图片

你可能感兴趣的:(c,c语言)