指针地址

指针(一)

什么是指针?从根本上看,指针式一个值为内存地址的变量(或数据对象)。正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。

地址(Address)

1.地址的作用

地址是系统用来查找数据位置的依据,标识存储单元空间

2.地址的表示

1>地址是一个十六进制表示的整数——用来影射一块空间
2>编址方式
按字节:每一个字节都有一个唯一的地址
按字(两个字节)
“段页式寻址”——段地址+段的偏移量+段内页地址+页的偏移量+页内偏移量

变量地址

字节编址下 ,一个变量占几个字节就要占几个地址编号,变量的地址是变量第一个字节的地址

变量地址表示:&变量名

**&**运算符
1.>单目运算符,优先级同!、~、++、–、-、(类型)、*、sizeof
2.>结合方向:自右向左
3.>计算(可完整表示一个变量的位置)
值,变量首字节的地址值;
变量有大小(不同类型的变量大小不同,例如:int型4个字节、double型8个字节)

变量单元的分配

在这里插入图片描述
由于我们多为用户,故多为由高地址向低地址进行分配

变量地址和变量单元

1>通过地址来查找单元
2>地址——>单元(单向映射)
可以通过地址表示单元*&变量名
例如:int x=3;
printf("%d,%d\n",x,(*&x));
//out 3,3
分析:( *&x)由x首字节的地址找到x的第一个字节,再判断类型确定大小,取出对应单元的存储数据
注意:用户区分配地址空间时,由高地址到低地址,但存储数据时,由低地址到高地址
由此我们可以说,变量=变量的存储数据+变量的地址(即首字节地址)

地址的计算 (&变量名±整数)

1>结果:地址值
2>计算过程:&变量名±整数*sizeof(变量名)
3>*地址值可表示一个单元的地址,但必须在表达式中体现该地址的对应表达类型
例如:假设变量单元在内存中是连续的
int x=3,y=5,z=7;
x的地址表示:&x,&y+1,&z+2;
x的变量表示:x,( *&x),( *(&y+1)),( *(&z+2))——地址指向表示法;
(&y)[1],(&z)[2]——下标表示法;
同理y、z;
在这里插入图片描述

经典例题解读

例 1 int x=3;
printf("%x\n",&x);//out 假设此时x的地址为12ff7c
printf("%d\n",( *&x));//out 3
printf("%d\n",(*0x12ff7c));//系统提示错误,因为此地址不知对应的类型,是void *;若想成功显示,则可通过地址的强制类型转换(int *)(0x12ff7c)
printf("%d\n", *(int *)(0x12ff7c));//out 3
例 2 假设内存单元连续
int x=3,y=5;
double d=3.14;
在这里插入图片描述
表示d的地址:类型不同必须转换成相同类型
&d,(double *)(&y-2),(double *)(&x-3)
表示d:
( *&d),( *(double *)(&x-3)),( *(double *)(&y-2))
表示x的地址:
&x,&y+1,(int *)(&d+2)-1
表示x:
( *&x),( *(&y+1)),( *((int *)(&d+2)-1))

猜你喜欢

转载自blog.csdn.net/weixin_43917444/article/details/89048318