试验程序
#include <rtthread.h>
int main(void)
{
char num = '1'; //定义字符变量num,并赋值字符‘1’
char *ptr = # //定义字符变量的指针ptr,并指向num变量
char **p_ptr = &ptr; //定义字符变量的指针p_ptr,并指向ptr变量
rt_kprintf("指针ptr指向的值%x\n",*ptr);
rt_kprintf("指针ptr的值%p\n",ptr);
rt_kprintf("变量num的值用十六进制格式输出%x\n",num);
rt_kprintf("变量num的值用字符格式输出%c\n",num);
rt_kprintf("变量num的地址%p\n",&num);
rt_kprintf("指向ptr指针变量的指针值%p\n",p_ptr);
return 0;
}
执行程序后输出如下:
指针ptr指向的值31
指针ptr的值20002d1c
变量num的值用十六进制格式输出31
变量num的值用字符格式输出1
变量num的地址20002d1c
指向ptr指针变量的指针值20002d18
解析
程序中有涉及三个变量,分别是num、ptr、p_ptr,它们的值分别是十六进制的31、20002d1c、20002d18。它们都是变量,虽然声明的类型都为char字符型,但对于32位地址系统来说,指针都是32bit,即占4字节;而字符变量num占1字节。ptr、p_ptr是特殊的变量,是用于保存指针的变量,习惯上称为指针变量,实际上保存的就是计算机系统的“地址”。
三个变量num、ptr、p_ptr在存储器里的位置如下图所示:
计算机编译时在存储器里划分了3个空间绑定这3个变量,写程序时,通过变量操纵相应的存储空间存放的值。这个系统采用小端保存数据,即低位地址保存低位字节的数据。
变量有三个要素
1.数据类型 (Type): 决定在内存中分配的空间
2.变量名(Name) : 编写程序时对所分配空间的操纵名称
3.值(Value) :空间中存储的数据
在调试程序时,通常可以查看这些要素:
普通变量num代表存储空间的值,“&num”代表其地址。对于指针变量ptr来说,ptr保存地址,“*ptr”代表其地址指向空间的值,“&ptr”代表保存指针空间的地址。而“*num”表示指出num值为地址的内容,由于num只有1字节,编译器会认为错误而不能生成可执行文件,故“*num”没有意义。