【C语言】指针剖析(2)

news2024/11/26 9:40:33

©作者:末央&

©系列:C语言初阶(适合小白入门)
©说明:以凡人之笔墨,书写未来之大梦

在这里插入图片描述

目录

  • 一、数组名
    • 1.概念
    • 2.sizeof和&里面的数组名
      • sizeof
      • &
  • 二、使用指针访问数组
  • 三、一维数组传参本质
  • 四、指针数组
    • 1.概念
    • 实例(模拟二维数组)
  • 五、手脑并用

一、数组名

什么是数组名?例如以下

1.概念

int arr[10];
//arr就是数组名;

那么数组名在内存中的地址有什么特殊的地方吗,可以看看。
在这里插入图片描述

总结:数组名是数组首元素的地址,即arr[0]的地址

2.sizeof和&里面的数组名

这里相对于我们上面总结的可以理解"数组名是数组首元素的地址"是两个例外

sizeof

int arr[10];
printf("%d\n", sizeof(arr));

在这里插入图片描述

&

int arr[10];
printf("arr[0]%p\n", &arr[0]);
printf("arr   %p\n", &arr);

在这里插入图片描述
这里值得注意的是arr和arr[0]的地址是一样的,那么&arr和&arr[0]还有区别吗?我们不妨在上面基础上再修改一下代码。

int arr[10];
printf("arr[0]%p\n", &arr[0]+1);		
printf("arr   %p\n", &arr+1);

结合我们上期的知识,知道指针加减一个整数取决于他的指针类型,&arr[0]的指针类型是int,&arr的指针类型是一个数组指针(后期会讲),那么那么前者+1就是跳过一个int(4个字节),后者+1就是跳过一个数组(40个字节)
这里还要注意的是我们为什么可以进行直接的指针+1-1运算,因为我们数组在内存中是连续存放的,如果不是连续存放的就有可能访问到我们没有权限访问的空间。
在这里插入图片描述

总结:sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩, 单位是字节
&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素 的地址是有区别的)
除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。

二、使用指针访问数组

我们通常访问数组都是以数组下标的方式来访问数组的,例如:

	int arr[10] = { 0 };
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}


但是我们也可以这样写:

int arr[10] = { 0 };
int i = 0;
int* p = arr;
for (i = 0; i < 10; i++)
{
	printf("%d\n", p[i]);
}

为什么指针也可以替代数组名的位置了,其实不管是数组访问还是指针访问都可以化成这样的形式:*(数组名/指针变量名+变量/常量)
那也可以这样写:

int arr[10];
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//输⼊
int* p = arr;
for (i = 0; i < sz; i++)
{
	scanf("%d", p + i);
	//scanf("%d", arr+i);//也可以这样写
}
//输出
for (i = 0; i < sz; i++)
{
	printf("%d ", *(p + i));
}

i[p]和i[arr]也可以,编译器
会把数组名[变量]转换为*
(数组名+变量)形式这里的[变量]
相当于a+b中的+号如果是-变量则是减号,支持加
法交换律

三、一维数组传参本质

看以下代码
1.

void test(int arr[])
{
 int sz2 = sizeof(arr)/sizeof(arr[0]);		//特别注意这里
 printf("sz2 = %d\n", sz2);
}
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 int sz1 = sizeof(arr)/sizeof(arr[0]);
 printf("sz1 = %d\n", sz1);
 test(arr);
 return 0;

在这里插入图片描述
为什么这里的sz2是1而不是和sz1一样是10呢,这就涉及到一维数组传参的问题了
我们刚刚在讲数组名的时候不是讲了除了sizeof和&里面的数组名以外,其他全是首元素地址。所有这里传参arr本质上就是传的首元素地址

又因为sizeof(arr) 计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。
所以首元素地址只有4个字节(int类型),4/4=1

四、指针数组

1.概念

指针数组到底是数组还是指针,指针是形容词数组是名词。所以指针数组本质上还是数组.其次整形数组是存放整形的数组,字符数组是存放字符的数组,那么指针数组实际上就是存放指针的数组
在这里插入图片描述

在这里插入图片描述

实例(模拟二维数组)

int arr1[] = {1,2,3,4,5};
 int arr2[] = {2,3,4,5,6};
 int arr3[] = {3,4,5,6,7};
 //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中
 int* parr[3] = {arr1, arr2, arr3};
 int i = 0;
 int j = 0;
 for(i=0; i<3; i++)
 {
 for(j=0; j<5; j++)
 {
 printf("%d ", parr[i][j]);
 }
 printf("\n");

在这里插入图片描述
要注意的是,上述代码只是模拟二维数组,实际上并不是真正的二维数组,因为他的行并不是连续存储的。而是通过指针找到每一行的首元素地址来进行访问。

再回忆一下我们之前说的p[i]=(p+i)这是一维数组用指针访问,那么二维数组是不是也可以触类旁通的写成:(*(arr+i)+j)

五、手脑并用

来来来,咱们直接上代码

nt main()
{
  int aa[2][5] = {10,9,8,7,6,5,4,3,2,1};
  int *ptr1 = (int *)(&aa + 1);
  int *ptr2 = (int *)(*(aa + 1));
  printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
  return 0;
}

小提示:这里明显涉及到我们上面讲的&数组面和前几篇文章讲的指针加减整数运算的概念问题。

好了,我们直接上图来看看吧
在这里插入图片描述
这里字有点丑哈,请谅解
那么结果就是:1 6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GitOps】使用Google工具JIB实现本地无需安装容器推送镜像,加速SpringCloud项目开发

文章目录 一、效果展示二、简介三、安装Jib插件1、区分环境2、安装插件一、效果展示 本地是window系统,无docker环境,没有任何runtime,使用jib工具打包镜像并推送完成,用时20秒 二、简介 Jib 是 Google 开发的一款开源工具,旨在帮助 Java 开发者更高效地将 Java 应用程…

25届近5年北京交通大学自动化考研院校分析

北京交通大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…

vue使用scrollreveal和animejs实现页面滑动到指定位置后再开始执行动画效果

效果图 效果链接&#xff1a;http://website.livequeen.top 介绍 一、Scrollreveal ScrollReveal 是一个 JavaScript 库&#xff0c;用于在元素进入/离开视口时轻松实现动画效果。 ScrollReveal 官网链接&#xff1a;ScrollReveal 二、animejs animejs是一个好用的动画库…

LabVIEW电压电流实时监测系统

开发了一种基于LabVIEW和研华&#xff08;Advantech&#xff09;数据采集卡的电压电流实时监测系统&#xff0c;通过高效的数据采集和处理&#xff0c;为工业和科研用户提供高精度、实时的电压电流监测解决方案。系统采用研华USB-4711A数据采集卡&#xff0c;结合LabVIEW编程环…

【自然资源】国家历史文化名城你知道多少?

【自然资源】国家历史文化名城你知道多少&#xff1f; 中国五千年的历史孕育出了一些因深厚的文化底蕴和发生过重大历史事件而青史留名的城市。根据《中华人民共和国文物保护法》&#xff0c;“历史文化名城”是指保存文物特别丰富&#xff0c;具有重大历史文化价值和革命意义…

数据恢复篇: 如何在数据丢失后恢复照片

数据丢失的情况并不少见。如果您曾经遇到过图像丢失的情况&#xff0c;您可能想过照片恢复工具是如何工作的&#xff1f;可能会丢失多少数据图像&#xff1f;即使是断电也可能导致照片和媒体文件丢失。 话虽如此&#xff0c;如果你认为删除的照片无法恢复&#xff0c;那你就错…

sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理

目录 搭建hadoop 下载hadoop JAVA 下载bin windows 改环境变量 将winutils.exe和hadoop.dll放到C:\Windows\System32下&#xff0c;然后重启 修改配置 vim core-site.xml vim hdfs-site.xml hadoop-env.sh mapred-site.xml yarn-site.xml 格式化命令 启动集群 …

大数据可视化实验(七):Python数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;绘制带颜色的柱状图。.. 1 2&#xff09;绘制堆叠柱状图。.. 3 3&#xff09;绘制数学函数曲线图。.. 4 4&#xff09;使用seaborn绘制组合图形。... 5 5&#xff09;使用Boken绘制多个三角形…

区块链技术与数字货币

1.起源 ➢中本聪(Satoshi Nakamoto), 2008 ➢比特币:一种点对点的电子现金系统 2.分布式账本技术原理 1.两个核心技术&#xff1a; ➢以链式区块组织账本数据实现账本数据的不可篡改 ➢分布式的可信记账机制 2.共识机制&#xff1a;由谁记账 ➢目的&#xff1a; ⚫ 解…

数据可视化期末总结

期末考试重点&#xff08;世界上最没意义的事情&#xff09; 选择 p8 数据可视化的标准&#xff1a; 实用、完整、真实、艺术、交互&#xff08;性&#xff09; p21 色彩三属性 色相、饱和度、亮度 p23 视觉通道的类型&#xff1a; 记得色调是定性 p39 散点图&#xff08;二维…

检查显卡驱动和cuda版本的对应关系并下载

1. CUDA 12.5 Release Notes — Release Notes 12.5 documentation Official Drivers | NVIDIA&#xff08;驱动下载&#xff09;搜索结果 | GeForce RTX 3090 | Linux 64-bit | NVIDIA nvidia-smi &#xff08;查看cuda&#xff09; pipx run nvitop nvcc -V https://deve…

飞书API 2-3:如何使用 API 创建数据表,解放人工?

一、引入 作为飞书多维表的深度使用者&#xff0c;经常需要将一些数据库的数据同步到多维表上&#xff0c;在数据写入之前&#xff0c;一般需要新建数据表和字段。当通过网页端界面新建字段时&#xff0c;如果字段少&#xff0c;还能接受手动一个个创建&#xff0c;不过一旦字…

win11 内存占用过大优化尝试

关闭开机加速 wins打开搜索 控制面板&#xff0c;打开控制面板 找到硬件和声音-电源选项-选择电源按钮的功能-去掉勾选启用快速启动 关闭windows 更新 winr 输入services.msc打开服务-搜索windows 更新-双击打开设置-选择禁用 貌似没什么用。

【C++ | 委托构造函数】委托构造函数 详解 及 例子源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

TypeScript学习笔记(全)

文章目录 TypeScript入门2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类型3.6.3.函数的vo…

【C++开发必备工具】Dependency Walker与Dependencies

Dependency Walker 与 Dependencies 1. Dependency Walker1.1 功能特点1.2 使用方法1.3 注意事项 2. Dependencies2.1 功能特点2.2 使用方法2.3 注意事项 3. 总结 1. Dependency Walker Dependency Walker 是一个免费软件工具&#xff0c;用于查看 Windows 应用程序的模块&…

el-tree结构清空选中节点

<el-tree:data"data"show-checkboxdefault-expand-allnode-key"id"ref"tree"highlight-current:props"defaultProps"> </el-tree>this.$refs.tree.setCheckedKeys(this.$refs.tree.getCheckedNodes(),false);

【单片机毕业设计选题24037】-基于STM32的电力系统电力参数无线监控系统

系统功能: 系统上电后&#xff0c;OLED显示“欢迎使用电力监控系统请稍后”&#xff0c;两秒后显示“Waiting..”等待ESP8266初始化完成&#xff0c; ESP8266初始化成功后进入正常页面显示&#xff0c; 第一行显示电压值&#xff08;单位V&#xff09; 第二行显示电流值&am…

编码大模型系列:Meta创新的“代码编译优化”的LLM

鲁班号导读正式上线。移步“鲁班秘笈”&#xff0c;查阅更多内容。 大型语言模型 (LLM) 已在各种软件工程和编码任务中展现出卓越的能力。然而&#xff0c;它们在代码和编译器优化领域的应用仍未得到充分探索。训练LLM需要大量资源&#xff0c;需要大量的 GPU时间和大量的数据…

【CodinGame】CLASH OF CODE - 20240630

前言 本文是CodinGame&#xff08;图片来自此&#xff09;随手做的几个&#xff0c;供记录用 要求&#xff1a; 代码 import math import syss input()for n in range(len(s)):print(s[n:])要求 代码 import sys import math# Auto-generated code below aims at helpi…