指针类型
指针是一个值,而计算机实际上是对全都是0和1两种数字的排列组合进行计算的,那为了区分各种不同意义的01序列就有了类型,如给一个数字定义为int就是整形数字如:1,2,3,4,5取值范围为-2147483648(-231)到2147483647(231-1),括号中为2的次方数。所以让计算机知道他现在得到是一个地址的值所以定义也需要清楚如:int* p:p是这个指针的名字,int*就是这个指针的类型。
指针类型的意义和作用
这个int也可以变化如:char* ,float*,void(*)(int,int),等这些都是指针类型最后一个为函数指针,后期会专门讲。*前面的类型就是定义了这个指针所指向的空间这个值的函数类型。因为当我们使用指针去调用这块空间的时候计算机并不知道这个空间的名字也不知道这个空间的值的类型,为让计算机做出正确处理我们在定义指针时也需要吧类型也标志上。
当变量为整形时如图:
当变量为字符型时如图
从上面两组图中可以看到变量a的值是一样的,同时指针P和K所指的地址也是完全相同的,但是值并不一定相同。这是内存读取方式不同导致的。
由于我的电脑是小端电脑所以低位的数字保存在低位的内存地址中k是一个char*的指针,char字符型的变量占用一个空间所以当我们使用k这个指针去访问这个地址的空间的时候它只会读取一个字节的空间也就是05这个值所在的空间,所以我们看到在第一组图中输出的值是相同的。
我们再看第二组图变量为char类型的,由于字符类型只有一个字节的空间当我们使用int*这个类型的指针访问这块空间的时候不仅把变量a的值访问了还把不属于变量a的后面三个字节的空间也一起访问了,这就属于是对内存空间的非法访问,后面的空间以这次为例是被系统初始化了值而得到图中这个数,在不同电脑中值是不一定相同的取决于这块空间中的值是多少。
总结
由以上我们能得出结论虽然在同一位数的电脑中每一个指针的大小都是相同的,但是不同类型的指针能决定在读取数据时读取空间的大小,以至于让CPU得到正确的数据;
拓展
指针的加减法
由上文我们了解到,指针是一个指向空间的值,既然指针也是一个值理所当然也是可以将这个值传送给CPU进行计算的,那指针的加减法是否如数学一样呢。
由上图我们看到第一个printf打印的两组数据与第二个printf打印的数据做对比,char*类型的指针在加一后的确与数学一样地址就是加一,而int*类型的则是加4。
在这里同上文一样字符型指针读取时是读取一个字节当作加减法时也是跳过一个字节的空间。而整形指针读取时是读取4个字节当做加减法时也是跳过4个字节的空间。所以当使用一个指针时这个指针的类型决定我们将多大一块空间看做是一个整体。