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

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.kler.cn/a/321239.html

相关文章:

  • Python习题 251:修改文件名称
  • 关系型数据库和非关系型数据库详解
  • 深度学习的多主机多GPU协同训练
  • 0x00基础算法 -- 0x05 排序
  • flink cdc 应用
  • CSS 响应式设计之媒体查询技术
  • CSDN文章导出md并迁移至博客园
  • 数据结构——初始树和二叉树
  • Spring AOP - 配置文件方式实现
  • 【IEEE 独立出版,快速EI检索】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)
  • 【编程基础知识】Cookie、Session和JWT(JSON Web Token)
  • Linux 学习 awk 和sed 命令使用
  • 欧洲欧盟药品数据库:EMA、HMA、EDQM-一键查询
  • WEB 编程:富文本编辑器 Quill 配合 Pico.css 样式被影响的问题之Shadow DOM
  • PostgreSQL 向量数据存储指南
  • 即梦PixelDance:从追赶到领跑,一跃成为全球AI竞赛的领航者!
  • 付费计量系统的标准化框架(下)
  • PCIe扫盲(14)
  • 树莓派基础命令
  • Keil5安装arm和C51共存环境
  • SSC338D/SSC338Q CA7*2+IPU5M/Multi-sensorISP: HDR/3DNR
  • 一键转换:Python如何轻松将PPT转换为PDF
  • Spring(三)Spring事件+计划定时任务+条件注解+SpringAware
  • 详细解释在Android开发中如何实现自定义View
  • Vue.js入门
  • “AI+Security”系列第3期(二):AI赋能自动化渗透测试