关于C指针——和指针的第一次亲密接触

先看代码:

#include<stdio.h>

int main(void){
    
    int a = 5;
    int b = 10;
    int *c;
    
    //输出每个变量的地址
    printf("a的地址是 %p\n",&a);
    printf("b的地址是 %p\n",&b);
    printf("c的地址是 %p\n",&c);
    
    /*将a的地址赋予c*/
    c = &a;//此处需用到  ”&“来得到a的地址
    printf("c修改后的地址为 %p\n",c);
    
    /* 通过c输出a的内容*/
    printf("*c ---->%d\n",*c);
    
    /* 通过c修改a的内容*/
    *c = 10;
    printf("a---->%d\n",a);
    
    return 0;
}

然后我们看运行结果

在这里插入图片描述

我们首先声明了int型变量 a,b 然后声明了”指向int 的指针“类型的变量c

我们暂且先将c理解为指向int 的指针

再看初始化完后内存中保存的样子在这里插入图片描述

在c语言中,会存在 int类型,double类型,等。。同样,c语言中也存在指针类型这样的类型。
指针类型并不是单独存在的,而是由其他类型派生出来的。。

由引用类型T派生的指针类型有时候称为’(指向)T的指针‘

因为指针类型是类型,所以他也像其他类型一样,有“指针类型的值和指针类型变量”,但有时,我们将“指针类型”,“指针类型变量”,“指针类型的值”简单统称为—指针

因此 c就是一个指针类型变量-----指向int的指针,但此时并为对它赋值。

接下来我们将a的地址赋予了c,此时c的值就是a的地址在这里插入图片描述

接下来:

在指针前面加*,可以表示指针指向的变量,因为现在c指向a,所以c就等同于a。同理,修改c就相当于修改了a的值。

这是对后两行输出做的解释

补充:

如果说c是 指向int的指针,但我们声明变量时一般要遵循:

类型 变量名

因此,我们似乎声明了一个名为*c的变量。

所以我们可以写成 int* c的形式。这样更符合 类型 变量名 的形式。

但之后就会出现问题:
数组也是C语言的一种类型。。如果按上述所说的话。
C语言声明数组时应该是:

int[] array;

很明显,会报错。这就产生了矛盾。。

反而,Java中可以这么写,但是Java为了让C程序员更好的转向Java。也兼容了c语言定义数组的写法。。

在这里需要插一句:

C语言的语法本来就是不自然的,奇怪的而又变态的。

之后我会出一篇关于C语法的博客专门研究这“变态的”c语法。。。

欢迎吐槽评论

发布了10 篇原创文章 · 获赞 9 · 访问量 518

猜你喜欢

转载自blog.csdn.net/VistorsYan/article/details/103980929