指针作为一种引入类型。不同的表示方式到底有什么区别?
比如:double *、float*、int * 、char *、void *等;
不管是指向 double的指针,还是指向int的指针。其实都是一种指针类型,在某种意义没有任何区别。在这里,说一下相同点和不同点。
这时候便想起“指针就是地址”,这句话貌似也是正确的了。
#include <stdio.h>
int main(void)
{
int *p;
float *q;
double *t;
void *hope;
char i = 10;
printf("p-> = %p\n",p);
printf("q-> = %p\n",q);
printf("t-> = %p\n",t);
printf("hope-> = %p\n",hope);
printf("&p = %p\n",&p);
printf("&q = %p\n",&q);
printf("&t = %p\n",&t);
printf("&hope = %p\n",&hope);
return 0;
}
运行结果:
p-> = (nil)
q-> = 0x400680
t-> = 0x4004a0
hope-> = 0x7ffd9493b440
各个指针指向的值,基本上都是无效值,或者说是些垃圾数据。
&p = 0x7ffd9493b338
&q = 0x7ffd9493b340
&t = 0x7ffd9493b348
&hope = 0x7ffd9493b350
指针变量本身的地址。它们就是占用8个字节的指针变量,没有任何不一样的地方。
#include <stdio.h>
int main(void)
{
int *p;
float *q;
double *t;
void *hope;
char i = 10;
printf("p-> = %p\n",p);
printf("q-> = %p\n",q);
printf("t-> = %p\n",t);
printf("hope-> = %p\n",hope);
printf("&p = %p\n",&p);
printf("&q = %p\n",&q);
printf("&t = %p\n",&t);
printf("&hope = %p\n",&hope);
printf("------------------------------------\n");
printf("------------------------------------\n");
p = &i;
q = &i;
t = &i;
hope = &i;
printf("p-> = %p\n",p);
printf("q-> = %p\n",q);
printf("t-> = %p\n",t);
printf("hope-> = %p\n",hope);
printf("&i = %p\n",&i);
printf("&p = %p\n",&p);
printf("&q = %p\n",&q);
printf("&t = %p\n",&t);
printf("&hope = %p\n",&hope);
return 0;
}
运行结果为:(编译的时候会有警告,这里我们先不要关注它)
p-> = (nil)
q-> = 0x4007a0
t-> = 0x4004e0
hope-> = 0x7ffc617fcf20
&p = 0x7ffc617fce18
&q = 0x7ffc617fce20
&t = 0x7ffc617fce28
&hope = 0x7ffc617fce30
------------------------------------
------------------------------------
p-> = 0x7ffc617fce17
q-> = 0x7ffc617fce17
t-> = 0x7ffc617fce17
hope-> = 0x7ffc617fce17
&i = 0x7ffc617fce17
&p = 0x7ffc617fce18
&q = 0x7ffc617fce20
&t = 0x7ffc617fce28
&hope = 0x7ffc617fce30
结果说明无论哪种类型的指针变量,都可以指向i。这里的*p、*q、*t、*hope的值也就都是10。这里就验证了那句话,“指针变量本身的地址。它们就是占用8个字节的指针变量,没有任何不一样的地方。”
以上标蓝色的地址为什么会和程序一不一样。因为在计算机中变量是随机分配的,所以程序二和程序一变量是不相同的。
总结:在指针编程中,一定要把所有的精力放到内存上去,而不是变量本身。
那么为什么不写成一样呢?为什么char和int类型会区别那么大呢?它们之间到底有什么玄机?
这里先卖个关子。想听继续分解,请见下篇博文。