指针变量类型的意义
指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各 种各样的指针类型呢?
可以看出,int*类型的指针改变了n的四个字节。
当pi为char*类型的指针是,只是将n的第一个字节改变为了0。
因此有结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。 ⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。
指针运算
1.指针加减整数
可以看到,&n,pc,pi都是相同的,这是因为,取出的是最小的地址,然而,pc+1比pc增加了1,pi+1比pi增加了4,
可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。 这就是指针变量的类型差异带来的变化。指针+1,其实跳过1个指针指向的元素。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。
指针加减整数也可以用于数组访问
其实数组的访问本质上就是通过指针去完成的
也即是说:a[i] == *(a+i)
2.指针 - 指针
指针减去指针其实得到的就是两个指针之间的元素个数
如图,通过两个指针相减可以模拟实现strlen函数来求字符串长度。
可以这样理解:
数组a[]中,a+i,是下表为i的元素读到地址,所以(a+i)- a = i,两个指针相减得到了一个整数
3.指针的关系运算
void*类型指针
在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为⽆具体类型的指针(或者叫泛型指 针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进 ⾏指针的+-整数和解引⽤的运算。
在上⾯的代码中,将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。编译器给出了⼀个警 告,是因为类型不兼容。⽽使⽤void*类型就不会有这样的问题。
⼀般 void* 类型的指针是使⽤在函数参数的部分,⽤来接收不同类型数据的地址,这样的设计可以 实现泛型编程的效果。