【18】C语言 | 数组详解

news2024/9/23 3:19:54

目录

1、数组的格式

2、下列有什么区别 

3、维数组的使用

4、*p 和 int* p = arr 的含义

5、二维数组:打印一个二维数组

6、二维数组在数组中的存储

7、数组作为函数参数

8、数组名是数组首元素的地址


1、数组的格式

数组是一组相同类型元素的集合。

数组的创建方式:

type_t arr_name [const_n];

//type_t 是指数组的元素类型

//const_n 是一个常量表达式,用来指定数组的大小

2、下列有什么区别 

 

 说明打印数组的时候是以'\0'结尾的

3、维数组的使用

对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。它其实就数组访问的操作行。我们来看代码:

int main()
{
    int i = 0;  //做下标
    int arr[10] = {0};//数组的不完全初始化

    //计算数组的元素个数
    int sz = sizeof(arr) / sizeof(arr[0]);
    arr[4] = 5;   //第5个元素赋值为5,这里的[4]是下标引用操作符

    //对数组内容赋值,数组是使用下标来访问的,下标从0开始:
    
    for(i=0; i<sz; i++) //这里写10好不好
    {
        printf("%d ",arr[i]);
    }
    //输出数组的内容
}

 再看下代码输出什么?

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

    return 0;
}

输出:

&arr[0] = 006FF7A8
&arr[1] = 006FF7AC
&arr[2] = 006FF7B0
&arr[3] = 006FF7B4
&arr[4] = 006FF7B8
&arr[5] = 006FF7BC
&arr[6] = 006FF7C0
&arr[7] = 006FF7C4
&arr[8] = 006FF7C8
&arr[9] = 006FF7CC
请按任意键继续. . .

4、*p 和 int* p = arr 的含义

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int* p = arr;     //数组的地址就是数组首元素的地址,现在把数组地址放到指针p中
                   //arr这个数组的地址放到p中,*说明是个指针变量,int:被指向的类型是整形
 int i = 0;
    for(i=0; i<=10; i++)
    {
        printf("%d ",*p);   //*p就是解引用(p是地址,解引用就是把p地址上的东西拿出来)
        p++;          //p++就是下一个地址p
    } 
 return 0 ;    

}

5、二维数组:打印一个二维数组

int main()
{
    int arr1[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    
    int i = 0;
    int j = 0;
    for(i=0; i<=2; i++ )
    {
        for(j=0; j<=3; j++)
        {
            printf("%2d ",arr1[i][j]);
        }
        printf("\n");
    }
    return 0;
}

6、二维数组在数组中的存储

int main()
{
    int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    
    int i = 0;
    int j = 0;
    for(i=0; i<=2; i++ )
    {
        for(j=0; j<=3; j++)
        {
            printf("&arr[%d][%d]=%p ",i,j,&arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

输出:说明二维数组在内存中也是连续存放的!行内部连续,跨行也是连续的!

&arr[0][0]=00B5F6EC &arr[0][1]=00B5F6F0 &arr[0][2]=00B5F6F4 &arr[0][3]=00B5F6F8
&arr[1][0]=00B5F6FC &arr[1][1]=00B5F700 &arr[1][2]=00B5F704 &arr[1][3]=00B5F708
&arr[2][0]=00B5F70C &arr[2][1]=00B5F710 &arr[2][2]=00B5F714 &arr[2][3]=00B5F718
请按任意键继续. . .

还可以用下面的方法知道!行内部连续,跨行也是连续的!

int main()
{
    int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    
    int i = 0;
    int*p = &arr[0][0];
    for(i=0; i<=12; i++ )
    {
        printf("%d ",*p);
        p++;
    }
    printf("\n");
    return 0;
}

7、数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传个函数,

比如:我要实现一个冒泡排序( 这里要讲算法思想)函数将一个整形数组排序。那我们将会这样使用该函数:

void popo(int arr[],int sz)
{
    int i = 0;
    for(i=0; i<sz-1; i++)
    {
        int j = 0;
        for(j=0; j<sz-1-i; j++)
            if(arr[j] < arr[j+1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
    }
}

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr) / sizeof(arr[0]);
    popo(arr,sz);
    

    return 0;
}

 

8、数组名是数组首元素的地址

但是有两个例外

#1.sizeof(数组名) 数组名表示整个数组

#2.&数组名,表示取这个数组的地址

 

//数组名是数组首元素的地址
//但是有两个例外
//1.sizeof(数组名) 数组名表示整个数组
//2.&数组名,表示取这个数组的地址
int main() 
{
    int arr[10] = { 0 };
    printf("%p\n",arr);
    printf("%p\n",arr+1);

    printf("%p\n",&arr);
    printf("%p\n",&arr+1);

    //printf("%p\n",arr);
    //printf("%p\n",&arr[0]);
    return 0;
}

 

学习浏览

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

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

相关文章

20230123英语学习

Interesting Studies to Spark Your Interest in the Research Field 科研也可以很有趣&#xff01;盘点那些好玩的研究 When it comes to picking studies worth reading, what scientists deem an interesting science article might be perceived differently by a person…

【Datewhale一起吃瓜 Task2】啃瓜第三章

文章目录线性模型关键&#xff1a;找到合适的w和b如何找到合适的 w和b&#xff1f;偏导为什么可以&#xff1f;推广线性模型 任务&#xff1a;找出一条线能够对数据进行划分或预测趋势 关键&#xff1a;找到合适的w和b 更适合于连续性的数值&#xff0c;如果数据是离散的如色…

AcWing 1020. 潜水员(二维费用背包)

一、问题 二、思路 这道题其实很容易看出是一个二维费用背包的变形&#xff0c;如果我们将氧气看作体积&#xff0c;将氮气看作价值的话&#xff0c;这道题就变成了从iii个物品里面选&#xff0c;体积至少为mmm&#xff0c;价值至少为nnn的条件下&#xff0c;所携带的物品的最…

Maplab:一个用于视觉惯性建图和定位研究的开源框架

摘要 鲁棒且精确的视觉惯性估计是当今机器人领域的重要挑战。能够用先验地图(prior map)进行定位(localize)并获得准确且无漂移的姿态估计&#xff0c;可以推动该系统的适应性。然而&#xff0c;目前大多数可用的解决方案都集中在单次使用&#xff0c;缺乏定位能力或端到端流水…

Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?

[1] 先讨论一个面试题 int a 1; Integer b 1; Integer c new Integer(1); Integer d Integer.valueOf(1); int e d; int f d.intValue();请问以下式子的值&#xff1f;为什么&#xff1f; a b // true a c // true b c // false[2] ""与"equals"…

C++设计新思维(泛型编程与设计模式之应用)之常整数映射为类别(2.4)

技术 模板偏特化&#xff0c;模板全特化 应用 1、有必要根据一个编译期常数调用一个或数个不同的函数 2、有必要在编译器实施"分派"(dispatch) 例子 如果打算在执行期进行分派(dispatch)&#xff0c;可使用if-else或switch语句。大部分时候其执行期成本都微不足…

windows权限维持方法详解

权限维持在获取服务器权限后&#xff0c;为了防止服务器管理员发现和修补漏洞而导致对服务器权限的丢失&#xff0c;测试人员往往需要采取一些手段来实现对目标服务器的持久化访问。权限持久化&#xff08;权限维持&#xff09;技术就是包括任何可以被测试人员用来在系统重启、…

Allegro如何通过飞线判断同一个网络连接位是否在同一直线操作指导

Allegro如何通过飞线判断同一个网络连接位是否在同一直线操作指导 Allegro可以通过飞线判断同一个网络的连接位是否在同一条直线上,如下图 当飞线是类似三角形的时候,可以判定两个连接点位是在同一条直线上 具体设置操作如下 选择Setup选择Design Parameter

React源码之render过程中发生了什么?

理解JSX 对于我们直接书写jsx语法&#xff0c;我们的浏览器是不理解我们这种语法的&#xff0c;所以需要babel来去转义&#xff0c;那么可以通过plugin-transform-react-jsx来转译jsx语法&#xff0c;使得浏览器可以识别我们的Jsx语法&#xff0c;例如&#xff1a; <div&g…

关于xshell简答使用

xshell是一个远程工具下载 官网地址&#xff1a;https://www.xshell.com/zh/xshell/直接下载即可~选择免费的授权页面 下载 不然要收费 也不要用盗版。运行后的xshell界面我们要建立服务器的连接点击加号 新建连接 即可 输入连接地址后 要输入 账号 和 秘密 OK 好了 可以使用了…

【Linux】Linux编译器gcc、g++

文章目录&#x1f3aa; Linux编译器gcc、g&#x1f680;1. 程序的编译⭐1.1 预处理⭐1.2 编译⭐1.3 汇编⭐1.4 链接⭐1.5 gcc/g常用指令&#x1f680;2. 函数库⭐2.1 静态库⭐2.2 动态库⭐2.3 动静态库对比&#x1f3aa; Linux编译器gcc、g 我们这以gcc为例&#xff0c;g编译器…

【学习笔记之数据结构】树的认识

树的概念&#xff1a; 树是一种非线性的数据结构&#xff0c;它由n&#xff08;n可以为0&#xff09;个有限的节点组成一个具有层次关系的结合。之所以把它称之为树是因为它的逻辑结构形似一个倒着的树。它的根在上面&#xff0c;叶子在下面。   有一个特殊的节点&#xff0c…

WebRTC系列-Qos系列之接收NACK

文章目录 1. 主要调用流程1.1 RTCP和RTP包区分1.2 查找丢失包2. RTX在文章 WebRTC系列-Qos系列之RTP/RTCP源码分析-RTP/RTCP包解析-3的2.3.3章节介绍了NACK包在WebRTC中解析方式及RFC规定协议的定义。 这篇文章开始,详细分析其接受RTCP包到解析nack的处理流程; 1. 主要调用流…

Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 一、Kotlin的可空性 null 在java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。 Kotlin作为更强…

STM32编写OLED显示屏驱动

文章目录前言一、OLED的器件地址二、编写写数据和写命令函数三、编写初始化OLED屏幕函数四、其他功能函数编写五、显示字符和数字函数编写总结前言 这篇文章将带大家学习如何编写OLED显示屏的驱动程序。这里我使用的是HAL库的硬件IIC&#xff0c;OLED屏幕使用的是SSD1306的。 …

sbt编程语言scala的构建工具配置及项目构建(附带网盘下载)

SBT简介 SBT 是 Scala 的构建工具&#xff0c;全称是 Simple Build Tool&#xff0c; 类似 Maven 或 Gradle。 Java可以用Maven快速构建项目&#xff0c;scala用SBT快速构建一个Scala项目。 sbt下载官网 百度网盘链接&#xff1a;https://pan.baidu.com/s/1eJkdWndZ0izcd3w…

Elasticsearch7.8.0版本高级查询——桶聚合查询文档

目录一、初始化文档数据二、桶聚合查询文档2.1、概述2.2、terms 聚合&#xff0c;分组统计的示例2.3、在 terms 分组下再进行聚合的示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求…

Yolo系列理论

参考文章&#xff1a;AI菌的YOLO系列 目标检测-Yolo系列发展Anchors Base原理Anchors Free原理YOLO v1Yolov1网络结构Yolov1实现方法Yolov1损失函数Yolov1总结YOLO v2Yolov2网络结构Yolov2改进细节Yolov2总结YOLO V3Yolov3网络结构YOLO V4Yolov4网络结构YOLOv4 BackBone训练策略…

数据库搏击

1. Mysql入门 1.1 Mysql5.7 安装配置 1.2 命令行连接到Mysql 1.3 图形化软件 1.3.1 Navicat SQLyog 1.4 数据库三层结构 所有安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS)&#xff0c;这个管理程序可以管理多个数据库。DBMS(database mana…

设计模式 - 六大设计原则之LSP(里氏替换)

文章目录概述里氏替换原则问题由来里氏替换的原则里氏替换原则的作用CaseBad ImplBetter Impl抽象银行卡类储蓄卡实现类信用卡实现类单元测试小结概述 里氏替换原则&#xff08;Liskov Substitution Principle , LSP&#xff09; 由麻省理工学院计算机科学西教授 Barbara Lisk…