一、指针是什么?
在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
二、指针和指针类型
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(double*));
return 0;
}
当我们输入上述代码时,运行会得到下列的结果
或
这是因为电脑地址线不同导致的,32位得到的为4,64位得到的为8,但是四种类型的指针大小都是相同的,既然都是相同的,为什么要区分不同的指针类型呢?
#include <stdio.h>
int main()
{
int a = 0x11223344;//0x表示16进制,一个十六进制位代表4个二进制位,11、22、33、44可以占四字节
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pc);
return 0;
}
输入上述代码虽会出现不兼容,但仍很好的将地址存储起来,得到相同的地址 ,既然地址可以存在不同的变量中,那指针的类型岂不是更没意义。
三、指针类型带来的区别
#include <stdio.h>
int main()
{
int a = 0x11223344;
int* pa = &a;
*pa = 0;
return 0;
}
我们将a的值进行更改,启动调试中的内存,输入&a通过a的地址我们可以看到内存
先不要管顺序,倒着我们可以看到放入的11223344,继续向下走,可以看到内存的改变
由44 33 22 11变为00 00 00 00 ,接下来我们换一种指针类型
#include <stdio.h>
int main()
{
int a = 0x11223344;
char* pc = &a;
*pc = 0;
return 0;
}
同样上述的操作,得到内存字节的改变。
我们可以看到仅有一个字节发生了改变。
指针类型有什么意义呢?指针类型存储数据时什么样的类型都可以存放,但是进行解引用操作时,就产生了差异,指针类型决定了指针进行解引用操作时能够访问的空间大小(能操作几个字节)。
读者可以自行尝试,int*可以访问4个字节,char*可以访问1个字节,double*可以访问8个字节,也就是int*指针认为它指向了一个int,只能访问四个字节,其余相同。
那么指针类型还有别的意义吗?
#include <stdio.h>
int main()
{
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pa+1);
printf("%p\n", pc);
printf("%p\n", pc+1);
return 0;
}
不难发现,第一行和第三行仍然相同,但是实行+1之后第二行相较于第一行+4,也就是跳过了四个字节,一个整型,而第四行相较于第三行+1,跳过一个字节,一个字符。指针类型还决定了指针一步走多远(指针的步长)。