C语言深入了解指针(2)-- 数组名的理解,数组传参的本质,二级指针,指针数组

【C语言】指针那些事之数组传参和指针传参的区别 该文章详细的讲解都有啥指针,及包括指针的日常使用等等,各位可以愉快的食用该文章的对于指针的理解,可以为大家对指针的理解加深一点。 阅读详情

目录

1. 数组名的理解

2. 使⽤指针访问数组

3. ⼀维数组传参的本质

4. ⼆级指针

5. 指针数组

6. 指针数组模拟⼆维数组


1. 数组名的理解

         这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且是数组⾸元素的地址。

#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\n", arr);
    return 0;
}

        一般情况下数组名就是首元素地址,但是以下两种情况特殊:

(1) sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节。

(2)&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的,如果直接用(数组名+1),则跳过的大小是数组中元素的大小。若用&数组名+1,则跳过的大小是整个数组的大小)

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);//也可以这样写
    }
    //输出
    for(i=0; i<sz; i++)
    {
        printf("%d ", *(p+i));
    }
    return 0;
}

        上述代码也能打印数组中的值,所以可知arr[i] ==  *(arr + i) == *(p + i) == p[i] .

3. ⼀维数组传参的本质

#include <stdio.h>
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;
}

        数组名是首元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组首元素的地址。所以上述函数中的代码计算的是首元素/元素大小 = 一个元素。所以在函数内部是没办法求得数组元素个数的。 

         总结:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式来接收。

4. ⼆级指针

        指针变量也是变量,是变量就有地址,存放指针变量地址的指针变量就是二级指针。

        二级指针解引用找到的是一级指针。二级指针解引用两次才能找到一级指针所指向的内容。 

5. 指针数组

        类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。那么指针数组,是存放指针的数组。指针数组的每个元素都是用来存放地址(指针)的。

注:指针数组是数组,用于存放指针。

        指针数组的形式和整型数组类似: 

6. 指针数组模拟⼆维数组

#include <stdio.h>

int main()
{
    //创建三个数组
    int arr1[] = {1,2,3,4,5};
    int arr2[] = {2,3,4,5,6};
    int arr3[] = {3,4,5,6,7};
    //创建指针数组,用于存放指向上述三个数组的指针
    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");
    }
    return 0;
}

        parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组i中第j个元素。上述的代码模拟出二维数组的效果,但是并非完全是二维数组,因为C语言中真正的二维数组每一行再内存中存储的地址是连续的,上述的每一行并非是连续的。 

若依集成mybatisplus、兼容旧分页【亲测有效】 service类继承ServiceImpl类 实现 你的Service接口。hutool工具包和lombok工具包如果不需要的话可以自行删除并修改后面的类里面的代码。自带的pagehelper用的1.4.6里面的jsqlparser用的4.5.0。mybatis-plus用的3.4.2里面的jsqlparser用的4.0.0。jsqlparser包,不剔除是这样的,有个冲突,我用的前端写的请求,返回的格式和原来的一样,已兼容。你的Entity类上面需要增加表的名字。 阅读详情

相关推荐

微信小程序返回按钮的隐藏玩法:用onShow实现数据自动刷新(附完整代码)

本文深入探讨了微信小程序中用户点击返回按钮后,如何利用onShow生命周期函数实现页面数据的自动刷新。文章对比了onLoad与onShow的差异,提供了从基础的本地存储标记到进阶的EventChannel事件通信,再到状态管理库的多种解决方案,并附有完整的代码示例,帮助开发者构建流畅的用户体验。

agile9scrum的博客 925

二维数组与二级指针

关于二维数组与二级指针那些你必须知道的事首先,来看一个例子一个error嗯,我是解析 首先,来看一个例子 #include <iostream> using namespace std; int main(void) { int **p; p=new int*[5]; for(int i=0;i<5;i++) { p[i]=new int[5]; } retu...

c46550的博客 1万+

本地化搭建DeepSeek+RAGFlow,构建个人知识库

本地化搭建DeepSeek+RAGFlow,构建个人知识库。至少32G以上内存、500G以上空余磁盘空间。

gogospecter的专栏 7428

[C] 数组指针、指针数组及数组传参

指针字符指针数组指针指针数组 在指针的学习阶段,有不少同学都十分畏惧这个物什,甚至“谈指针色变”。其实对指针的不理解,其实本质上是对内存的不理解,本篇博客就从零开始、系统的来讲解指针这个话题。 首先我们应该明确以下的一些基础常识: 指针是一个变量,用来存放地址,地址唯一标识一块内存地址。 指针的大小是固定的4 或 8个字节。(32或64位平台) 指针是有类型的,指针的类型决定了指针加减整数运算...

giturtle's blog 1万+

电动车辆的动力总成控制

手把手教你学Simulink——电动车辆的动力总成控制在汽车工程领域,电动汽车(EV)的动力总成控制系统是确保车辆性能、效率和驾驶体验的关键。动力总成控制系统通常包括电机控制、电池管理系统(BMS)、能量回收系统等组件。通过使用Simulink,我们可以模拟和测试这些系统的运行情况,优化设计,并验证控制算法的有效性。

amy_mhd的博客 968

ELK - CentOS7 安装 elasticsearch 7.17.5

elk elasticsearch 安装

qq_19783793的博客 1462

【C语言指针三】一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组、字符指针变量

文章摘要: 本文深入探讨C语言指针进阶知识,涵盖一维数组传参本质(传递首元素地址)、冒泡排序实现、二级指针运算规则、指针数组概念及应用。通过图解分析指针数组模拟二维数组的原理,并解析字符指针变量的两种使用场景,特别强调常量字符串不可修改的特性。最后以代码示例验证数组与指针的地址差异,帮助读者全面掌握指针核心用法。 (150字)

2501_93623544的博客 1675

Orale EBS R12 AP应付模块 发票导入接口(Interface)

ap_interface_groups_s.nextval; ap_invoices_interface_s.nextval; ap_invoice_lines_interface_s.nextval; SELECT * FROM ap_invoices_interface ih; SELECT * FROM ap_invoice_lines_interface il; SELECT * FROM...

qq_41206741的博客 3316

【C语言】指针(2):探索数组名和指针数组

通过深入理解指针(1),我们对指针有了一个初步的了解,还了解了指针变量类型的意义、指针的运算、assert断言、const修饰变量、野指针………………下面我们继续深入学习。

2302_81115588的博客 1554

Cadence OrCAD Capture原理图中为功能模块分配ROOM的方法

本文详解介绍原理图设计阶段为原理图模块分配ROOM的方法。

fydar的博客 1346

深度学习特征融合(feature fusion)操作详解

特征融合是指在深度神经网络中,将来自不同来源(如不同网络分支、不同模态、不同时间步、不同空间尺度或不同抽象层级)的特征表示进行有策略地整合,以生成更具判别性、鲁棒性和语义丰富性的联合特征表示。其核心目标是最大化信息互补性,最小化信息冗余与噪声干扰。关键问题:如何“有效”融合?——这取决于任务需求、数据特性、计算资源和融合机制的设计。✅ 是否对齐了空间/通道/模态?✅ 融合方式是否与任务匹配?(检测需定位+语义 → 多尺度融合)✅ 是否引入可学习机制提升适应性?✅ 是否控制了计算开销?

浩瀚之水的专栏 793

C语言指针详解(2):从”数组名“到”二级指针“,彻底搞懂指针与数组的 “爱恨情仇”(指针最强保姆教程)

本文深入解析了C语言中指针与数组的复杂关系,重点内容包括:1.数组名的三重身份:常规使用时为首元素地址,sizeof时代表整个数组大小,&数组名时获取整个数组地址;2.指针访问数组的本质:arr[i]等价于*(arr+i),指针变量也可使用下标;3.数组传参的真相:函数接收的数组参数实际是指针,需额外传递数组大小;4.二级指针原理:存储指针变量的地址,通过*和**进行多级访问;5.指针数组应用:可模拟二维数组结构。文章通过快递柜等生动比喻和代码示例,帮助读者理解这些关键概念,并提供了冒泡排序实现

hy20060720的博客 2455

网络安全系列-四十三:使用Suricata分析恶意流量pcap文件

本文基于[网络安全系列-三十六:使用Suricata IDS分析pcap文件]和 [网络安全系列-四十二: Suricata之rulesets的激活、更新及动态加载]的基础上,使用suricata针对包含恶意流量的pcap文件进行分析,触发事件告警,并对suricata输出的日志进行逐个分析,让你掌握针对恶意流量的分析步骤,及怎么查看suricata输出的日志。

penriver的博客 2887

函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)

今天阿辉将为大家介绍C语言的指针部分,包括字符指针、数组指针、数组传参的本质以及函数指针,关注阿辉不迷路哦 😘 ,内容干货满满😋,接下来就跟着阿辉一起学习吧👊。

m0_75108739的博客 1798

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言指针:数组名、二级指针

一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式,数组传参本质上传递的是数组首元素的地址。 二级指针解引用一次得到的就是指向的一级指针,二级指针解引用两次得到的就是一级指针指向的对象。

m0_62183318的博客 1045

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C语言—指针(2)

C语言—指针

2302_81120572的博客 2580

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C语言指针超详解(三)】--数组名的理解,一维数组传参的本质,冒泡排序,二级指针,指针数组

-我们先来思考一下指针数组是指针还是数组呢?我们类比⼀下,整型数组,是存放整型的数组,字符数组是存放字符的数组。那指针数组呢?那肯定就是存放指针的数组。指针数组的每个元素都是用来存放地址(指针)的。指针数组的每个元素都是地址,又可以指向一块区域。

会当凌绝顶,一览众山小 1469

【C语言】深入理解指针(二)

指针与数组的深度解析:从基础到实战 本文深入探讨了指针与数组的核心关系,首先揭示数组名的双重含义(通常为首元素地址,在sizeof和&运算时代表整个数组),通过指针偏移和解引用实现数组访问的等价操作。重点分析了一维数组传参的本质——实际传递的是首元素指针,导致函数内无法直接获取数组长度,必须额外传递大小参数。最后以冒泡排序为例,展示了指针操作数组的实战技巧,包括基础实现和优化版本。全文通过代码示例和内存分析,帮助读者掌握指针与数组协同工作的底层逻辑和应用方法。 (150字)

2301_78257800的博客 2262

【C语言进阶】⑤关于数组传参和指针传参辨析

文章目录一、数组1.1.一维数组1.2.二维数组1.3.指针和数组二、一维数组传参三、二维数组传参四、总结 一、数组 1.1.一维数组 int arr1[]={1,2,3,4,5,6,7,8}; 数组名 arr1 一般表示的是首元素的地址,以下两种情况除外: (1)&arr1表示整个数组元素的地址; (2)sizeof(arr),其中arr表示的是整个数组,sizeof(arr)计算的是整个数组的大小,单位是字节; arr和&arr的辨析,请下面图解: 1.2.二维数组 int

森林里的白杨 2163

C语言指针深入详解(三):数组名理解、指针访问数组、一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组

目录一、 数组名理解二、指针访问数组三、一维数组传参的本质四、 冒泡排序 五、二级指针六、指针数组七、指针数组模拟二维数组结语🔥个人主页:艾莉丝努力练剑🍓专栏传送门:《C语言》🍉学习方向:C/C++方向⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平 前言:前面几篇文章介绍了c语言的一些知识,包括循环、数组、函数、VS实用调试技巧、函数递归、操作符等,在这篇文章中,我将继续介绍指针的一些重要知识点!由于指针的内容较多,博主将会分为六篇博客介绍,这是第三篇!对指针感兴趣的友友们可以在评论

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1512

【C语言篇】深入理解指针2

本篇介绍了数组名的理解,一维数组传参的本质,实现冒泡排序,并模拟实现了二维数组,还介绍了字符串指针的易错点,C语言指针是一个重头戏,关于指针的内容会有4-5篇博客,敬请期待喔💕

半截诗的博客~ 1450

关于我重生到21世纪学C语言这件事——指针详解(2)

“至少还有你” —— 林忆莲

2401_88325505的博客 2198

【C语言】指针的 “多维世界”:二级指针、数组指针、数组指针与字符指针实战指南

本文深入讲解了C语言中二级指针和指针数组的概念与应用。二级指针是指向指针的指针,通过解引用可以访问和修改原始指针指向的值。指针数组是存放指针的数组,每个元素都是一个地址。文章还展示了如何使用指针数组模拟二维数组的效果,通过图解和代码示例清晰展示了其工作原理。尽管指针数组模拟的二维数组并非内存连续,但仍能实现类似功能。全文内容精炼,适合C语言学习者深入理解指针的高级应用。

小龙报的博客 1130

C_深入理解指针(二)—— 数组名的理解、使用指针访问数组、一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组

C_深入理解指针(二)—— 数组名的理解、使用指针访问数组、一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组

祯的博客 1113

C语言——数组名的理解,使⽤指针访问数组,⼀维数组传参的本质,⼆级指针,指针数组,指针数组模拟⼆维数组

可以看到,虽然&arr0]和&arr的地址相同,但是将它们加一之后,&arr[0]+1增加的是四个字节,&arr+1增加的是20个字节也就是整个数组所占的字节数,所以整个数组的地址和数组首元素的地址还是有差别的。我们对数组名解引用之后可以看到数组首元素的值跟数组名中存储的值相同,数组首元素的地址和数组名的地址也相同,所以,数组名其实就是数组首元素的地址。我们知道整形数组里面存放的都是整形的元素,字符数组存放的都是字符元素等等,那么,指针数组里面存放的是什么类型的元素呢,当然是指针类型的元素。

2403_82366393的博客 1057

深入理解指针(3):数组传参本质,二级指针,指针数组,冒泡排序

本文主要讲解了C语言中数组和指针的相关概念及应用。首先分析了数组名的本质是首元素地址,并讨论了两种特殊情况(&数组名和sizeof(数组名))。其次阐述了一维数组传参时实际传递的是首元素地址。接着介绍了二级指针的概念和使用方法,以及指针数组的特点和模拟二维数组的实现。最后详细说明了冒泡排序算法的原理和代码实现,包括优化方法。这些内容有助于深入理解C语言中数组和指针的关系及实际应用。

2502_91954313的博客 887
上一篇: C语言深入了解指针(1)-- 指针变量和地址(指针),指针变量类型的意义,const 修饰指针,指针运算,野指针,assert 断言,传址调用
下一篇: C语言深入了解指针(3)-- 字符指针变量,数组指针变量,函数指针变量,函数指针数组,回调函数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值