目录:
5.疑问解答:指针的解引用
6.指针+或-整数
7.特殊类型*void指针
5.疑问解答:指针的解引用
观察下列代码产生的现象
#include <stdio.h>
int main()
{
int n = 0x12345678;//十六进制存储
int* pi = &n;
*pi = 0;
return 0;
}
改为char
#include <stdio.h>
int main()
{
int n = 0x12345678;//十六进制存储
char* pi = &n;
*pi = 0;
return 0;
}
改为short
#include <stdio.h>
int main()
{
int n = 0x12345678;//十六进制存储
short* pi = &n;
*pi = 0;
return 0;
}
发现:char* 的指针解引用就只能访问1个字节,而short*的指针的解引用能访问2个字节,而 int* 的指针的解引用就能访问4个字节(x64、x86下的结果一样)
总结:指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)
6.指针+或-整数
#include <stdio.h>
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 <stdio.h>
int main()
{
int n = 0x12345678;//十六进制存储
short* ps = &n;
return 0;
}
运行后会报警告:
但如果用:
#include <stdio.h>
int main()
{
int n = 0x12345678;//十六进制存储
void* pv = &n;
return 0;
}
则没有问题
注:一般void* 类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果