要透彻理解C语言指针,只要能看懂下面三点即可(结合下面的代码):
- #include <stdio.h>
- int main(void)
- {
- int *int_ptr;
- short *short_ptr;
- char *char_ptr;
- int a = 0x01020304;
- int_ptr = &a;
- short_ptr = (short *)&a;
- char_ptr = (char *)&a;
- printf("*int_ptr = 0x%x, *short_ptr = 0x%x,"
- "*char_ptr = 0x%x\n", *int_ptr, *short_ptr, *char_ptr);
- return 0;
- }
1、 指针变量的声明
看第5行,在这里星号(*)只是用来告诉编译器要声明一个指针变量int_ptr,同声明数组和函数要使用中括号和小括号的意义一样(千万要注意int_ptr才是指针变量,而不是*int_ptr);这里的关键字int只是用来说明指针变量int_ptr将要匹配的值只能是整型数据的首地址(整型数据一般有四个字节,其中每一个字节对应一个32位的地址值,而指针变量的大小常见的也是4个字节,所以指针变量只能存储整型变量的首地址而已),同理,数组指针和函数指针就是指这个指针将要匹配的值是某种类型数组或函数的首地址而已。
2、 给指针变量赋值
很简单,与普通变量的赋值是一样的。如第11行,简单地取整型变量a的首地址赋值给指针变量int_ptr即可。注意,当类型不匹配时,需要进行强制类型转换,如第12和13行,指针变量short_ptr和char_ptr分别能匹配的值是短整型和字符型数据的首地址,所以需要对整形变量a的首地址进行类型转换。
3、 使用指针变量
使用指针变量就更简单了,直接在指针变量前使用间接运算符星号(*)即可,使用*int_ptr就是相当于在使用整型变量a。注意,*short_ptr和*char_ptr不能得到整型变量a所有的数值,因为它们只能获知各自所匹配的数据类型长度的数值。
4、例子简要说明
指针变量int_ptr、short_ptr和char_ptr的值相同,都是整型变量a四个字节地址当中的低地址。这里还涉及大小端的问题,笔者使用的intel CPU是小端模式,所谓小端模式就是低位字节数据(如0x4)存储在低位字节地址上。
例子输出结果:
- *int_ptr = 0x1020304, *short_ptr = 0x304,*char_ptr = 0x4