在说指针类型前,我们先热身一下,int类型占4个字节、short类型占2个字节、char类型占1个字节。一个字节又分8个bit。更详细一点:
-
- int a=5; // 四个字节、一个字节8个比特位
- 00000000 00000000 00000000 00000101
-
- short a=5; // 两个字节、一个字节8个比特位
- 000000000 00000101
指针类型是什么?
指针变量的类型分为整形指针、字符指针、数组指针等等。 例如:整形指针 int* p 、字符指针char* p、短整形指针short* p等。但它们都有一个共同点:在32位系统下占4个字节,在64位系统下占8个字节。
重点来了,字节已经确定,为什么还需要划分类型来区别呢?又或者说划分类型有什么作用呢?
1、决定了指针类型进行解引用操作的时候,一次性访问n个字节
char* 一次可访问1个字节(8个bit位) int* 一次可访问4个字节(32个bit位) 等等
- int a=0x11223344; //想想两位16进制的大小和8位二进制的大小
-
- 11 22 33 44
- 对应的二进制是 00010001 00100010 00110011 01000100
-
-
- char* p=&a;
- printf("%d",*p); // 打印得:68
- //指针p只能访问一个字节 所以只能有后面的8位bit,也就是:01000100
-
- int* p=&a;
- printf("%d",*p); //打印得:287454020
- //指针p只能访问4个字节:00010001 00100010 00110011 01000100(全部)
2、如果我用指针指向不同类型的变量,然后通过指针修改变量值呢?
- int a=0x11223344;
- // 对应的二进制是:00010001 00100010 00110011 01000100
- 十进制是:287,454,020(逗号不存在)
-
- char* p=&a;
- *p=20; //20对应的二进制是00010100;
-
- printf("%d",*p); // 解引用一个字节,所以打印得:20
-
- printf("%d",a); // 打印287,453,988,因为指针p把a后面的一个字节修改了
结论:效果很明显,只能在原来的变量上修改自己解引用部分,
3、那么指针类型不同和地址的关系呢?
- int a=0x11223344; //想想两位16进制的大小和8位二进制的大小
- 11 22 33 44
- 00000000 00000000 00000000 00000000
-
- int* p=&a;
- char* w1=&a;
-
- printf("%p",p); //
- printf("%p",p+1); // p和p+1的地址相差4,因为指针类型为int,所以跳过4个字节
-
- printf("%p",w);
- printf("%p",w+1); // w和w+1的地址相差1,因为指针类型为char,所以跳过1个字节
结论:很明显,(指针)和(指针+1 )的地址相差取决于指针类型
注:有些编译器不支持 指针指向不同的类型变量,所以我们可以强制类型转换
例如: char* p = (char*) & a;