注意:1.以下所有代码及运行结果均在VS2017编译器下成功编译和运行。
2.文章里面的代码笔者会省略#include
首先声明一个整数和一个整数指针:
int i;
int *p;
单纯地看这两个家伙,你会觉得这两个家伙长的好像。就是指针多了一个*号而已。既然长的像,那会不会有什么关联呢?肯定是有关联的,既然i是个变量,那么p也应该是个变量,只不过变量i存的是个整数值,变量p存的是地址而已。一般情况下,我们不想用到变量p存的地址的时候,就可以用*号把变量p存的地址所对应的值取出来。接下来,我们通过编程来看看:
int i;
int *p;
i=2;
p=&i;
printf("%p,%p,%d,%d\n", p,&i,*p,i);
运行结果为:00BCFE88, 00BCFE88, 2,2
从以上代码及运行结果可以看出,指针p就是变量,只不过它存的是i地址,而我们不想要它存的地址的时候,就可以利用*号来把地址所对应的数值给取出来。
这又带给我们一个思考,既然指针p是变量,能不能对指针p取地址呢?接下来,我们通过编程来看看:
printf("%p,%p,%d,%d,%p\n", p,&i,*p,i,&p);
运行结果为:003AF940, 003AF940, 2,2,003AF934(地址值每次编译会不一样)
通过这个,我们更能初步理解指针了。指针就是变量,它也有地址,只不过在它的这个地址下所存的东西,也是个地址。变量i也有地址,只不过在这个地址下所存的是一个数值而已。但是,指针p可以用*号把它存的地址所对应的值给取出来。
我们可以这样来理解:
p<-->&i
*p<-->i
接下来,让我们又来看看一个不可思议的现象,通过编程:
printf("%d, %d, %d\n", sizeof(int*), sizeof(char*), sizeof(double*));
printf("%d, %d, %d\n", sizeof(int), sizeof(char), sizeof(double));
运行结果为: 4, 4, 4
4, 1, 8
int的大小为4字节,char的大小为1字节,double的大小为8字节(在笔者的编译器及电脑运行的情况下)。那为什么指针都是4个字节呢(在笔者的编译器及电脑运行的情况下)?这个我们可以这么理解,指针变量存放的是地址,我们可以看到上面打印出来的地址都是16进制数且都只有8位,而每一位16进制数代表着4位二进制数,因此一个地址就代表了32位二进制数,这不正好是4个字节吗(一个字节由8个二进制位组成)?换句话说,只需要4个字节就可以保存指针变量了。当然,这要根据cpu,编译器,操作系统而定。至少,在笔者的编译器和电脑运行下,不同类型的指针大小就是4个字节。
关于指针的一小部分知识,笔者就先介绍到这里。