取值运算符*和地址运算符
在指针的学习中,必不可少的两个操作符:*和&。
在定义一个指针的时候,比如
short *p;
表示一个指向short数据类型的指针,具体表达的意思就是这个指针P指向的一个数据类型是short类型,也就是说操作的这个数据是个short类型数据。“*”表示的取值运算符,就是要获取指针指向的内存地址里面的数据。
p本身是一个内存地址值,通常说的指向某个地址,就是表示P的值就是这个地址,通过取值运算符(*),才能获取指向这个内存里面的数据值。
例如现在定义一个数组
unsigned char data[] = {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80};
数据在内存排列方式如下(小端模式):
0x10 | 0x20 | 0x30 | 0x40 | 0x50 | 0x60 | 0x70 | 0x80 |
- 如果定义一个short类型(16位)指针
short *p = data;
printf("output value: %x\n", *p);
则打印输出为:
output value: 0x2010
- 如果定义一个long类型(32位)指针
long *p = data;
printf("output value: %x\n", *p);
则打印输出为:
output value: 0x40302010
可以看出,指针P指向的内存地址都是同一个,但是随着指针指向的数据类型不同,通过取值运算符(*)获取的值也是不同的。
在数组data中,如果我想定义一个指针,指向第5个地址,就需要地址运算符
short *p = &data[4];
这个时候,指针P就直接指向data[4]这个数据的地址。
指针P是指向一个地址,那么如何获取一个变量的地址,就是靠地址运算符(&)。
总结起来,
取值运算符(*)表示获取这个指针指向的地址里面的数据值,
地址运算符(&)表示获取这个变量在内存的地址。