先看代码:
#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语法。。。
欢迎吐槽评论