当前位置: 首页 > article >正文

指针变量和地址

A.指针变量和地址

  理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实就是向内存申请空间,比如:

#include <stdio.h>
int main()
{
 int a = 10;
 return 0; }

  ⽐如,上述的代码就是创建了整型变量a,内存中申请4个字节,⽤于存放整数10,其中每个字节都有地址,上图中4个字节的地址分别是:

0x006FFD70
0x006FFD71
0x006FFD72
0x006FFD73

  那我们如何能得到a的地址呢?这⾥就得学习⼀个操作符(&)-取地址操作符

#include <stdio.h>
int main()
{
 int a = 10;
 &a;//取出a的地址
 printf("%p\n", &a);
 return 0;
 }
  按照我画图的例⼦,会打印处理:006FFD70,&a取出的是a所占4个字节中地址较⼩的字节的地址。
  虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,顺藤摸⽠访问到4个字节的数据也是可⾏的。

B.指针变量

  那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x006FFD70,这个数值有时候也是需要 存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。 ⽐如:
#include <stdio.h>
int main()
{
 int a = 10;
 int* pa = &a;//取出a的地址并存储到指针变量pa中
 
 return 0;
}
  指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。

C.如何拆解指针类型

  我们看到pa的类型是 int* ,我们该如何理解指针的类型呢?

int a = 10;
int * pa = &a;
  这⾥pa左边写的是 int* * 是在说明pa是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int) 类型的对象。

  那如果有⼀个char类型的变量ch,ch的地址,要放在什么类型的指针变量中呢?

char ch = 'w';
pc = &ch;//pc 的类型怎么写呢?

D.解引用操作符

  我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?
  在现实⽣活中,我们使⽤地址要找到⼀个房间,在房间⾥可以拿去或者存放物品。
  C语⾔中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)
  指向的对象,这⾥必须学习⼀个操作符叫解引⽤操作符(*)。
 #include <stdio.h>
int main()
{
 int a = 100;
 int* pa = &a;
 *pa = 0;
 return 0; }
  上⾯代码中第7⾏就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间, *pa其实就是a变量了;所以*pa = 0,这个操作符是把a改成了0.
  有同学肯定在想,这⾥如果⽬的就是把a改成0的话,写成 a = 0; 不就完了,为啥⾮要使⽤指针呢?
  其实这⾥是把a的修改交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活,后期慢慢就能理解了。

E.指针变量的大小

  前⾯的内容我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储。
  如果指针变量是⽤来存放地址的,那么指针变的⼤⼩就得是4个字节的空间才可以。

  同理64位机器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的⼤⼩就是8个字节。

#include <stdio.h>
//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
 printf("%zd\n", sizeof(char *));
 printf("%zd\n", sizeof(short *));
 printf("%zd\n", sizeof(int *));
 printf("%zd\n", sizeof(double *));
 return 0; }
  结论:
32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

http://www.kler.cn/a/135862.html

相关文章:

  • LeetCode429周赛T4
  • 代理模式(JDK,CGLIB动态代理,AOP切面编程)
  • 未来将要被淘汰的编程语言
  • SAP HCM 考勤时间冲突到分 源码分析
  • CSS系列(30)-- 逻辑属性详解
  • CCF-GESP 等级考试 2023年9月认证C++一级真题解析
  • 11.1 文件拷贝移动与删除
  • 【Java】异常处理(一)
  • K8S基础笔记
  • 极域电子教室-教师机无法找到学生机
  • ArcEngine:如何进行缩放图层、属性信息显示、状态栏显示?
  • 关于这个“这是B站目前讲的最好的【Transformer实战】教程!“视频的目前可以运行的源代码GPU版本
  • 采集1688整店商品(店铺所有商品、店铺列表api)
  • 北京君正客户应用案例:掌静脉3D人脸猫眼视屏智能锁
  • 信息机房监控系统(动环辅助监控系统)
  • 4种经典的限流算法与集群限流
  • MAC地址_MAC地址格式_以太网的MAC帧_基础知识
  • IDEA运行thymeleaf的html文件打开端口为63342且连不上数据库
  • pnpm : 无法加载文件 E:\Soft\PromSoft\nodejs\node_global\pnpm.ps1,
  • 理解Android线程基础与多线程编程模型
  • CTFHub Git泄露
  • Spring Framework IOC依赖查找 - 按类型查找解析
  • Linux-CentOS重要模块
  • 编写高效的消息传递代码-对消息进行降维
  • 不同content-type对应的前端请求参数处理格式
  • HTTP四种请求方式,状态码,请求和响应报文