C指针问题之不同类型指针之间的区别

会想这样的一个问题:

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

emmmm
貌似也有一定道理。

Solution

既然我们无法从正面解释,那我们就先设定一个“万能指针”
看我接下来这段操作:
C指针问题之不同类型指针之间的区别_第1张图片
在这里我创建了一个“可以指向任何类型的指针类型”——void*类型

但是当我运行的时候,出现了一个错误:C指针问题之不同类型指针之间的区别_第2张图片
仔细想一下,如果仅仅知道了地址,但是不知道保存的数据类型,也是无法取出值的。
也就是说,上边的错误和下边的错误是一样的C指针问题之不同类型指针之间的区别_第3张图片
也会报同样的错误。

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

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

成功!

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

int *hoge_p;

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

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

指针运算

书写如下代码:

#include 

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指针问题之不同类型指针之间的区别_第4张图片
我们知道c语言地址是以16进制的方式存储的。
发现:

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

不难看出::

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

你可能感兴趣的:(征服C指针)