目录:
5.疑问解答:指针的解引用
6.指针+或-整数
7.特殊类型*void指针
5.疑问解答:指针的解引用
观察下列代码产生的现象
- #include
- int main()
- {
- int n = 0x12345678;//十六进制存储
- int* pi = &n;
- *pi = 0;
- return 0;
- }
改为char
- #include
- int main()
- {
- int n = 0x12345678;//十六进制存储
- char* pi = &n;
- *pi = 0;
- return 0;
- }
改为short
- #include
- int main()
- {
- int n = 0x12345678;//十六进制存储
- short* pi = &n;
- *pi = 0;
- return 0;
- }
发现:char* 的指针解引用就只能访问1个字节,而short*的指针的解引用能访问2个字节,而 int* 的指针的解引用就能访问4个字节(x64、x86下的结果一样)
总结:指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)
6.指针+或-整数
- #include
- int main()
- {
- int n = 0x12345678;//十六进制存储
- int* pi = &n;
- short* ps = &n;
- char* pc = &n;
- printf("&n=%p\n",&n);
- printf("pi+1=%p\n",pi+1);
- printf("ps+1=%p\n",ps+1);
- printf("pc+1=%p\n",pc+1);
- return 0;
- }
发现:char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节,short* 类型的指针变量+1跳过2个字节(同理+2,-1,-2……+n,-n)
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)
7.特殊类型void* 指针
*定义:无具体类型的指针(或者叫泛型指针)
*注意:这种类型的指针可以用来接受任意类型地址,但是也有局限性:不能直接进行指针的+-整数和解引用的运算(*pv=? 错误 pv+1 错误),除非强制类型转换( *(int*)pv=200 )
- #include
- int main()
- {
- int n = 0x12345678;//十六进制存储
- short* ps = &n;
- return 0;
- }
运行后会报警告:
但如果用:
- #include
- int main()
- {
- int n = 0x12345678;//十六进制存储
- void* pv = &n;
- return 0;
- }
则没有问题
注:一般void* 类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果