这是学习指针的过程中遇到的一个问题的记录。
因为C++指针指向具体的内存地址,开始以为按照内存地址的加减就可以进行任意内存数据区域的操作,实际测试的时候发现,定义的指针有不同的类型,比如:
int * p;
定义的是一个整数型指针。*(p+1)指向的是下一个整型数,也就是内存地址加4(32位系统),不是内存地址加1。如果是字符型指针,则是地址加1,因为char占1个字节。
如果要对char型数组按int型数据操作,编译是不允许的,因为类型不一致。甚至显示强类型转换也不行。这种情况就需要用到无类型指针(void *)。
无类型指针可以指向任意类型指针地址。采用显示强制类型转换,还可以将无类型指针转换为其他类型指针。也就是如果要按int类型操作char数组,需要先转换为无类型指针,然后在转换为int类型指针才能工作。
一下是测试代码:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char chArr[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x00};
void *void_p = chArr;
int *int_p = static_cast<int *>(void_p);
//int *int_p = static_cast<int *>(chArr); //字符数组指针直接转强制转换到整型指针编译不过
cout<<"print the content of void_p: "<<static_cast<char *>(void_p)<<"\n";
cout<<"print the content of int_p: ";
for(int i = 0; i < sizeof(chArr)/sizeof(int); i++)
{
cout<<hex<<*(int_p + i)<<" ";
}
return 0;
}
输出结果如下: