会想这样的一个问题:

== 指针就是地址吧,那么指向int 的指针也好,指向double的指针也好,他们有什么不同么==

emmmm
貌似也有一定道理。

Solution

既然我们无法从正面解释,那我们就先设定一个“万能指针”
看我接下来这段操作:

在这里插入图片描述

在这里我创建了一个“可以指向任何类型的指针类型”——void*类型

但是当我运行的时候,出现了一个错误:

在这里插入图片描述

仔细想一下,如果仅仅知道了地址,但是不知道保存的数据类型,也是无法取出值的。
也就是说,上边的错误和下边的错误是一样的

在这里插入图片描述

也会报同样的错误。

如果我们把第一个做法中printf函数稍作更改

1
printf("%d\n",*(int*)hoge_p);

成功!

因此,与其写成这样,还不如刚开始就定义他的类型

1
int *hoge_p;

这样编译器会记住 hoge_p是指向int的指针
这也就是为什么指针要定义他的类型。

关于这一点,还有一个地方需要用到他的类型:
==指针运算==

指针运算

书写如下代码:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(int argc, char *argv[]) {
int hoge;
int* hoge_p;
hoge_p = &hoge;
printf("hoge_p 的初始地址为:%p\n",hoge_p);
hoge_p++;
printf("hoge_p 加一后:%p\n",hoge_p);
printf("hoge_p 加一之后再加三后:%p\n",hoge_p + 3);
}

发现运行结果:

在这里插入图片描述

我们知道c语言地址是以16进制的方式存储的。

发现:

第一个地址与第二个地址的值相差4,第二个与第三个地址的值相差12.

不难看出::

对指针加N,指针前进“当前指针指向的数据类型的长度×N”