先看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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语言声明数组时应该是:

1
int[] array;

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

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

在这里需要插一句:

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

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

欢迎吐槽评论