int *p; //定义int型指针变量
char *q1, *q2; //定义两个字符型变量
p = (int *)malloc(sizeof(int)); //为p申请一份4字节内存空间
q1 = (char *)p; //将int型指针变量p强制转化为char型指针变量,并让q1指向p
q2 = q1 + 1; //q2指向q1+1的空间
*q1 = 'A'; //q1指向的值为'A'
*q2 = 'B'; //q1指向的值为'B'
printf("p中的数据:%c\n", *p); //将p指向的值用格式化字符输出,而不是整型
printf("p的地址:%d\n", p);
printf("q1的地址:%d\n", q1);
printf("q2的地址:%d\n", q2);
运行结果:
可以看出,p和q1指向的是同一个地址,而q2指向的地址的p1的地址加1,而p指向的值是’A’,这也是q1指向的值。
因为int占4字节,因此int型指针p读取的地址是从p起始地址开始的4个字节,同理char型指针q1的读取地址是从q1起始地址起始的1字节范围。
执行 q1 = (char *)p; 后,q1也指向了p所在的地址空间,但是只有4字节的范围,而由于p被强制转化成了char型指针,因此当执行“printf(“p中的数据:%c\n”, *p);”语句时,*p指读取第一个字节的内容。
如果执行“printf(“p中的数据:%d\n”, *p);”语句注意变成了%d,此时将输出未知的数字