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

C语言指针系列1——初识指针

祛魅:其实指针这块儿并不难,有人说难只是因为基础到进阶没有处理好,大家要好好跟着一步一步学习,今天我们先来认识一下指针


指针定义:指针就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。

有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。

有些小伙伴可能问题重重,我们一句一句的解释~

 指针变量是用来存放内存地址的变量

首先,假设我们的内存长这样

以变量a为例,指针变量为p

我们发现p就和门牌号一样,指向了变量a,p就是a的地址,也是a的指针

那么如何用代码来表示呢?

这个时候就要引入进来两个符号了,& 取地址,* 解引用,下面依然以变量a为例我们来写一下代码 

#include <stdio.h>
int main() {int a = 10;int* p = &a;printf("%p\n",p);printf("%p\n", &a);return 0;
}

我们可以看到,他们的结果是一样的,都是a的地址,其中  int*  是指针变量中的int类型,而 & 符号则为取地址符号

 在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的

 我们都知道,变量类型有 int , double , float ,char , short 等

同样的,指针变量也有这些类型  int* , double* , float* ,char* , short*(PS:也可以中间空一格再打出*,如: int   *   )

那么 不同类型的指针变量所占用的存储单元长度是相同的 到底对还是不对呢,这个时候我们突然想起来 sizeof 好像可以计算字节,那么我们就可以用代码来试一试

#include <stdio.h>
int main() {printf("%zd\n", sizeof(int*));printf("%zd\n", sizeof(double*));printf("%zd\n", sizeof(float*));printf("%zd\n", sizeof(char*));printf("%zd\n", sizeof(short*));return 0;
}

我们发现无论是哪种类型,指针变量都是8个字节,这是在x64的环境下 

而在x86,也就是32位的情况下,又是几个字节呢?

这个时候我们发现在x86下则是四个字节 

这就是为什么说是 在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的

 而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同

这句话又该怎么样理解呢?

首先我们先来写个代码对比一下,这里是以 int* 和 char* 作对比

#include<stdio.h>
int main() {int n1 = 0x11223344;char* pi = (char*)&n1;*pi = 0;printf("%x\n", n1);int n2 = 0x11223344;int* pc = &n2;*pc = 0;printf("%x\n", n2);return 0;
}

我们发现他更改的字节不同,char*只能改一个字节,而int*则都改掉了

这样我们就可以理解这句话了


今天我们就先说到这里,给大家打下一个良好的基础,下次我们再一步一步来学习! 

http://www.lryc.cn/news/446939.html

相关文章:

  • 传神论文中心|第26期人工智能领域论文推荐
  • NLP基础1
  • 001.docker30分钟速通版
  • Kafka 在 Linux 下的集群配置和安装
  • Python--操作列表
  • JMeter(需要补充请在留言区发给我,谢谢)
  • 线程池的执行流程和配置参数总结
  • node-red-L3-重启指定端口的 node-red
  • (done) 使用泰勒展开证明欧拉公式
  • 红队apt--邮件钓鱼
  • 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)
  • DNS协议解析
  • 每日一题——第一百零八题
  • 使用Python免费将pdf转为docx
  • 树莓派4B+UBUNTU20.04+静态ip+ssh配置
  • C#实现指南:将文件夹与exe合并为一个exe
  • linux信号 | 学习信号三步走 | 全解析信号的产生方式
  • C++ 刷题 使用到的一些有用的容器和函数
  • 【Kubernetes】常见面试题汇总(三十四)
  • C++标准库双向链表 list 中的insert函数实现。
  • 华为机考练习(golang)
  • 51单片机快速入门之按键应用拓展
  • 数据库 - MySQL的事务
  • 【Python机器学习】NLP信息提取——提取人物/事物关系
  • vector类
  • python常见的魔术方法
  • 自动化测试常用函数:弹窗、等待、导航、上传与参数设置
  • 【必看】2024国赛选题分布情况分析及数模国赛答辩指南~答辩不走弯路
  • 微服务注册中⼼1
  • 我设置了路由器自动切换ip,这会让我的账号登录地址经常改变吗