指针浅谈(三)

     在指针浅谈(二)http://t.csdnimg.cn/SKAkD中我们讲到了const修饰指针、指针运算、野指针、assert断言和传址调用的内容,今天我们继续学习有关数组名、指针访问数组、一维数组传参的本质相关的内容,内容比较深入,如果觉得哪里讲解的不行,可以参考其他大佬的文章呦。

1.数组名的理解

     在之前我们使用指针访问数组时,有以下代码:

int arr[10]={1,2,3,4,5,6,7,8,9,10};
int* p=&arr[0];

     这里&arr[0]表示取出数组第一个元素的地址赋给指针变量p,但是你看下面这个代码和运行结果:

#include<stdio.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};printf("&arr[0]=%p\n",&arr[0]);printf("arr=%p",arr);return 0;
}

     你会神奇的发现,wc,这出错了吧,这怎么可能,数组名的地址怎么能和数组第一个元素的地址相同呢?但事实上,数组名就是数组首元素的地址。

      这时候倘若我放出下面这段代码,阁下该如何应对?

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", sizeof(arr));return 0;
}

       我直接懵逼了,到底哪个是对的?其实两个都是对的,数组名确实是数组首元素的地址,但在两个情况下是例外的:

 (1)sizeof(数组名):sizeof中放数组名,数组名表示整个数组,计算整个数组的大小。

 (2)&数组名,这里的数组名表示整个数组,取出的是整个数组的地址,这和首元素的地址是有区别的。区别就在于下面这段代码

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] = %p\n", &arr[0]);printf("&arr[0]+1 = %p\n", &arr[0]+1);printf("arr = %p\n", arr);printf("arr+1 = %p\n", arr+1);printf("&arr = %p\n", &arr);printf("&arr+1 = %p\n", &arr+1);return 0;
}

     我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1相差4个字节,这是我们意料之中的,毕竟数组名是数组首元素的地址,但&arr和&arr+1相差40个字节,这是因为&arr是数组的地址,+1之后直接跳过整个数组,虽然它和数组首元素地址相同,但区别就在于指针+-运算跳过的多少。

     总的来说,数组名是数组首元素的地址,但是有sizeof和&数组名两个意外。

2.使用指针访问数组

     讲的是指针,那我们就要用指针,已经知道了这么多关于数组的知识,就应该学习如何用指针访问数组。

#include <stdio.h>
int main()
{int arr[10] = {0};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);//也可以这样写//scanf("%d", arr[i]);//scanf("%d", p[i]);}//输出for(i=0; i<sz; i++){printf("%d ", *(p+i));printf("%d ", p[i]);//或者这样写printf("%d ", arr[i]);}return 0;
}

      这段代码怎么理解呢?其实并不难,将数组首元素的地址赋给了指针变量p,那我们就可以访问整个数组,毕竟数组是一段连续的存储空间,知道了首元素地址,就可以顺藤摸瓜找到其他元素,运用指针运算,遍历整个数组进行赋值,因为数组首元素也是地址,相当于一个指针,所以也可以写成arr+i,等价于arr[i]。其实数组名arr和p在这里等价,所以也可以是p[i],输出时,我们需对指针变量解引用获取元素值即可。

3.一维数组传参的本质

     我们知道数组是可以传递给函数的,那数组是把自己所有元素全部传过去吗?显然不是,在早期的计算机设备中,内存是很小的,如果一下传很多元素过去,会很占用内存,效率低下,那数组是怎么传过去呢?下面就让我们了解一下。

     之前我们都是在函数外部计算数组的元素个数,那能不能在函数内部进行求解呢?

#include <stdio.h>
void test(int arr[])//形参也可以写成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;
}

     我们发现其实并不能这样做,这时候就要学习数组传参的本质了,刚才学到数组名是数组首元素的地址,那传参传的是数组名,也就是说本质上数组传参传递的是数组首元素的地址。

     所以函数形参应该使用指针变量来接收首元素地址,那我们在函数内部写sizeof(arr)计算的是一个地址的大小,不是数组的大小,正是因为这样,我们在函数内部是没有办法求数组元素个数的。

     今天的指针先讲到这里,下期再见!

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

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

相关文章

Docker部署Nacos集群并用nginx反向代理负载均衡

首先找到Nacos官网给的Github仓库&#xff0c;里面有docker compose可以快速启动Nacos集群。 文章目录 一. 脚本概况二. 自定义修改1. example/cluster-hostname.yaml2. example/.env3. env/mysql.env4. env/nacos-hostname.env 三、运行四、nginx反向代理&#xff0c;负载均衡…

关于Pytorch和Numpy中的稀疏矩阵sparse的知识点

Pytorch和Numpy中的稀疏矩阵sparse 0 稀疏矩阵类别0.1 coo_matrix0.2 dok_matrix0.3 csr_matrix0.4 csc_matrix0.5 bsr_matrix0.6 bsc_matrix0.7 lil_matrix0.8 dia_matrix 1 pytorch中的稀疏矩阵1.1 to_sparse()1.2 to_sparse_csr()1.3 sparse_coo_tensor()1.4 sparse_csr_ten…

基于Java新人入职管理系统

基于Java新人入职管理系统 功能需求 1、个人信息管理&#xff1a;系统需要提供个人信息管理功能&#xff0c;包括新人的基本信息、联系方式、教育背景、工作经历等。 2、入职流程管理&#xff1a;系统需要提供入职流程管理功能&#xff0c;包括入职手续的办理、合同签订、入…

【JavaEE学习】初识进程概念

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、…

AI:ElasticSearch

ElasticSearch是一款开源的分布式搜索引擎和数据分析引擎&#xff0c;主要用于处理海量数据并提供近实时的搜索和分析功能。它具有全文检索、结构化检索和数据分析等特点&#xff0c;能够满足各种复杂的搜索需求。ElasticSearch使用Java编写&#xff0c;可以运行在多个服务器上…

python:五种算法(GA、OOA、DBO、SSA、PSO)求解23个测试函数(python代码)

一、五种算法简介 1、遗传算法GA 2、鱼鹰优化算法OOA 3、蜣螂优化算法DBO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

C++中使用汇编

在 C 中编写汇编代码通常需要使用内嵌汇编&#xff08;inline assembly&#xff09;的方式。内嵌汇编允许将汇编代码直接嵌入到 C 代码中&#xff0c;以实现对底层硬件的直接访问和控制。下面是详细解释和示例说明如何在 C 中写汇编代码&#xff1a; 使用内嵌汇编的语法&#x…

百度文库下载要用券?Kotlin爬虫几步解决

百度作为国内知名的网站&#xff0c;尤其是文库里面有各种丰富的内容&#xff0c;对我们学习生活都有很大的帮助&#xff0c;就因为其内容丰富&#xff0c;如果看见好用有意思的文章还用复制粘贴等方式就显得有点落后了&#xff0c;今天我将用我所学的爬虫知识给你们好好上一课…

基于51单片机的语音识别控制系统

0-演示视频 1-功能说明 &#xff08;1&#xff09;使用DHT11检测温湿度&#xff0c;然后用LCD12864显示&#xff0c;语音播放&#xff0c;使用STC11l08xe控制LD3320做语音识别&#xff0c; &#xff08;2&#xff09;上电时语音提示&#xff1a;欢迎使用声音识别系统&#xf…

go-zero开发入门之网关往rpc服务传递数据

go-zero 的网关往 rpc 服务传递数据时&#xff0c;可以使用 headers&#xff0c;但需要注意前缀规则&#xff0c;否则会发现数据传递不过去&#xff0c;或者对方取不到数据。 go-zero 的网关对服务的调用使用了第三方库 grpcurl&#xff0c;入口函数为 InvokeRPC&#xff1a; …

【vue实战项目】通用管理系统:信息列表,信息的编辑和删除

本文为博主的vue实战小项目系列中的第七篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装token操作…

实验制备高纯酸PFA酸纯化器材质分析,SCH亚沸蒸馏器特点是什么

.酸纯化器&#xff1a;也称酸蒸馏器、高纯酸提取系统、酸纯化系统、亚沸腾蒸馏器、高纯酸蒸馏纯化器。常规实验室分析中&#xff0c;各种酸及试剂被广泛应用于日常的样品处理及分析中。那么应该选用什么材质的酸纯化器呢 氟塑料酸纯化器&#xff0c;提纯酸效果好&#xff0c;避…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(四)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存4. 模型生成 系统测试1. 训练准确率2. 测试效果 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff…

蓝桥杯小白赛第一场(1~6)(期望DP)

1、模拟 2、贪心 3、前缀和 4、猜结论 5、双指针 6、期望DP 1. 蘑菇炸弹 思路&#xff1a;一个简单的暴力模拟。 #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;vector<int>a(n , 0);for(int i 0 ; i < n ; i )cin &…

智能优化算法应用:基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.…

Linux---Ubuntu操作系统

1. Ubuntu操作系统的介绍 Ubuntu操作系统是属于Linux操作系统中的一种&#xff0c;它是免费、稳定又可以拥有绚丽界面的一个操作系统 2. Ubuntu图形界面的介绍 任务栏 窗口操作按钮 窗口菜单条 任务栏效果图: 窗口操作按钮效果图: 窗口菜单条效果图: 3. 与Windows目录结…

嵌入式系统复习--ARM技术概述

文章目录 上一篇ARM体系结构Thumb技术介绍ARM处理器工作状态ARM的异常响应过程ARM存储器接口及存储器层次下一篇 上一篇 嵌入式系统复习–概述 ARM体系结构 ARM体系结构的技术特征 ARM的体系结构采用了若干Berkeley RISC处理器的特征 Load/store体系结构固定的32为指令3地址…

django-path函数使用

django.urls.path 是 Django 中用于定义 URL 映射规则的函数之一。它用于创建 URL 模式&#xff0c;将请求的 URL 映射到相应的视图函数或处理器。 基本语法 path(route, view, kwargsNone, nameNone)route: 字符串&#xff0c;表示 URL 的路径。可以包含转换器&#xff08;如…

LSTM 双向 Bi-LSTM

目录 一.Bi-LSTM介绍 二.Bi-LSTM结构 Bi-LSTM 代码实例 一.Bi-LSTM介绍 由于LSTM只能从序列里由前往后预测,为了既能够从前往后预测,也能从后往前预测,Bi-LSTM便被发明了出来。简单来说,BiLSTM就是由前向LSTM与后向LSTM组合而成。 二.Bi-LSTM结构 转自:

5. PyTorch——数据处理模块

1.数据加载 在PyTorch中&#xff0c;数据加载可通过自定义的数据集对象。数据集对象被抽象为Dataset类&#xff0c;实现自定义的数据集需要继承Dataset&#xff0c;并实现两个Python魔法方法&#xff1a; __getitem__&#xff1a;返回一条数据&#xff0c;或一个样本。obj[in…