C语言学习笔记——(2)数组

2023-05-16

数组

    • 1、什么是是数组
    • 2、数组的定义
      • 2.1数组的表达
      • 2.2数组的含义
      • 2.3数组的大小:
    • 3. 字符数组
    • 4.字符串操作
    • 5.二维数组

1、什么是是数组

数组是指有序的元素序列。如果将有限个类型相同的变量的集合命名,那么这个名称就是数组名,而组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
简而言之,数组就是有限个相同类型变量的有序序列。数组中的数据按着一定的方式存储到空间

2、数组的定义

再讲数组前先引进一个概念:基本数据类型和构造数据类型

基本数据类型包括:整型(short,int,long)、实型(又称浮点型)(float和double)、字符型char、布尔型bool等。
构造数据类型包括:数组类型、枚举类型enum、指针类型、引用类型、结构体struct、联合体union(又称联合,共用体)、类class等。

构造数据类型指可以通过其他的数据类型进行构造,可由程序员自定义,故又称为 “自定义数据类型”。

今天所学的数组属于构造数据类型

2.1数组的表达

数组:数据类型 数组名[数组长度];

数组的定义(以int类型的数组举例):
1、int a[5] (定义数组但不赋值)
2、int a[5] = {0,1,2,3,4} (定义数组但不赋值)
3、int a[] = {0,1,2,3,4} (不写下标但给数组赋值)
3、int a[5] = {0,1,2} (部分赋值)
5、int a[] (这个对不对呢?)
我们测试一下a[]的定义会发现报错 "array size missing in ‘a’"这是告诉我们不知道数组的大小,所以5是错误的
我们比较上面4个,我们会发现,在定义的时候我们都可以知道数组的大小,如3没有直接说明,但3给数组赋值了,我们可以知道这个数组有5个元素。
注意:数组定义后,数组的大小是不能修改的。就相当于我们做好了一个元器件盒子了,实物已经做出来我们就没办法改变盒子的容量了。

数组中元素的表达:数组名[下标];
下标:下标就是数组中元素的位置距离首地址的偏移量
int a[5] = {0,1,2,3,4}

  1. 数组中第n (n<=5)个元素的表达:数组名[n-1]
  2. 数组中第一个元素的地址表达:&数组名[0] , 数组名(数组名也是地址)
  3. 给第n个元素赋值:a[n-1] = x;
  4. 输出下标为i的元素内容:printf("%d",a[i]);----将数组中第i+1个数据打印到我们屏幕上
  5. 数组空间连续,地址也是连续

2.2数组的含义

数组构造的类型:

  1. 构造一个数组类型,存储多个字符数据
    字符数组 char 数组名[数组长度]
  2. 构造一个数组类型,存储多个整型数据
    整型数组 int 数组名[数组长度]
  3. 构造一个数组类型,存储多个浮点型数据
    浮点型数组 float 数组名[数组长度] -/- double 数组名[数组长度]

2.3数组的大小:

数组大小 = 数组类型*数组长度

int a[3]		sizeof(a) = 6 / sizeof(a) = 12
char a[3]		sizeof(a) = 3
float a[3]		sizeof(a) = 12
double a[3]		sizeof(a) = 12

3. 字符数组

  1. 定义一个数组a,里面可以存放100个字符 char a[100];
  2. 数组a的大小:100
  3. 特点:空间连续,地址连续
  4. 数组中首地址:a // &a[0 ]// &a
  5. 数组元素输入、输出:%c
  6. 字符数组中允许用户一次输入多个字符:%s
    scanf("%s",存放多个字符的首地址);%s 就是字符串的输入(遇见回车或者是空格结束输入)
    printf("%s",输出字符的首地址);---------遇见\0字符,就停止输出
    %s格式控制符:针对于字符串
    什么是字符串?多个字符的集合,字符串有一个结束标志’\0’,常用:“”引起来

字符数组的初始化
1.1 全部初始化 char a[5]={‘a’,‘b’,‘c’,‘d’,‘e’};-------字符数组
char a[5]={“abcd”};-----字符串数组
char a[5]=“abcd”;------字符串数组
1.2. 部分初始化 char a[5]={“a”}; 没有初始化的元素默认为’\0’
数组空间清0:char a[5]={’\0’};
1.3. 省略数组长度进行初始化
char a[]={‘a’,‘b’,‘c’,‘d’,‘e’};
char b[]="abcde“

4.字符串操作

1 strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2 strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1);
返回字符串 s1 的长度。
4 strcmp(s1, s2);
比较字符串,如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5 strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[14] = "runoob";
   char str2[14] = "google";
   char str3[14];
   int  len ;
 
   /* 复制 str1 到 str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );
 
   /* 连接 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );
 
   /* 连接后,str1 的总长度 */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );
 
   return 0;
}

结果:
strcpy( str3, str1) :  runoob
strcat( str1, str2):   runoobgoogle
strlen(str1) :  12

5.二维数组

定义: 数据类型 数组名[行长度][列长度];
表达:定义一个 空间 存放3个一维整型数组(每个整型数组都有5个元素)
int a[3][5];
大小:sizeof(a)= sizeof(数据类型)行长度列长度=60
元素: 数组名[行下标][列下标]
元素的地址:& 数组名[行下标][列下标]
理解:
二维数组其实就是多个一维数组的组合我们此处可以引入一个格子来说明,如下图所示。
在这里插入图片描述

我们假设这个二位数组的起始地址为0x00,则地址的变化为上图箭头所示,如果数组类型是char的话,占据一个格子,为int类型的话占据2/4个格子,我们此处以char类型来说明。
按照上面的格子我们可以知道此处定义的是char [8][4]的数组,此二维数组是有8个char [4]的一维数组组成。
二维数组中空间连续,地址也是连续。
二维数组首地址: a / &a / &a[0][0] / a[0]

一维数组的首地址可以用a表示
二位数组的第n维的首地址可以用a[n]来表示

思考题
一维数组int a[5],地址a和地址&a的区别是什么?a+1 和 &a+1一样吗?

#include <stdio.h>

int main()
{
   int a[5];
   printf("a = %p,&a = %p\n",a,&a);
   printf("a+1 = %p,&a+1 = %p\n",a+1,&a+1);
   return 0;
}

结果:
a = 0x7fffe3772f20,&a = 0x7fffe3772f20
a+1 = 0x7fffe3772f24,&a+1 = 0x7fffe3772f34

比较比较a与a+1的偏移量和&a与&a+1偏移量可以发现
a与a+1的偏移是一个int类型的大小,&a与&a+1的偏移是int [5]的大小

如果是二位数组呢?int b[3][5]
二维数组的b[0]和&b[0]也可以理解为一维数组的a和&a(可以用程序验证下)

#include <stdio.h>

int main()
{
   int a[5];
   int b[3][5];
   printf("a = %p,&a = %p\n",a,&a);
   printf("a+1 = %p,&a+1 = %p\n",a+1,&a+1);
   printf("b[0] = %p,&b[0] = %p\n",b[0],&b[0]);
   printf("b[0]+1 = %p,&b[0]+1 = %p\n",b[0]+1,&b[0]+1);
   return 0;
}

结果:(自己比较想想)
a = 0x7ffe8b1e2920,&a = 0x7ffe8b1e2920
a+1 = 0x7ffe8b1e2924,&a+1 = 0x7ffe8b1e2934
b[0] = 0x7ffe8b1e28e0,&b[0] = 0x7ffe8b1e28e0
b[0]+1 = 0x7ffe8b1e28e4,&b[0]+1 = 0x7ffe8b1e28f4

**如果是b和&b的区别呢?**想想看程序运行的结果和你想的一样不

#include <stdio.h>

int main()
{
   int b[3][5];
   printf("b = %p,&b = %p\n",b,&b);
   printf("b+1 = %p,&b+1 = %p\n",b+1,&b+1);
   return 0;
}
结果:
b = 0x7ffd5cfdfe40,&b = 0x7ffd5cfdfe40
b+1 = 0x7ffd5cfdfe54,&b+1 = 0x7ffd5cfdfe7c

/***********************************
0x7c-0x40 = 40个字节
(3+5)*4 = 40;
**********************************/

b和b+1是一个int [5]的大小 &b和&b+1是int [3][5]的大小。

自己思考思考理解理解,这点知识对你学后面的指针是很用帮助的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言学习笔记——(2)数组 的相关文章

  • IIC 驱动OLED

    IIC总线可以驱动很多器件 xff0c 比较常见的有OLED EEPROM存储器 xff08 AT24C02 xff09 温度传感器 xff08 LM75A xff09 温湿度传感器 xff08 DHT11 xff09 等 有关IIC总线协
  • Stm32-使用TB6612驱动电机及编码器测速

    这里写目录标题 起因一 电机及编码器的参数二 硬件三 接线四 驱动电机1 TB6612电机驱动2 定时器的PWM模式驱动电机 五 编码器测速1 定时器的编码器接口模式2 定时器编码器模式测速的原理3 编码器模式的配置4 编码器模式相关代码5
  • CAN总线协议入门基础原理

    CAN 是 Controller Area Network 的缩写 xff08 以下称为 CAN xff09 xff0c 是 ISO 1 国际标准化的串行通信协议 CAN 通过 ISO11898 及 ISO11519 进行了标准化 xff0
  • SPI总线协议基本原理及相关配置

    单片机应用中 xff0c 最常用的通信协议主要有三个 xff0c 即USART IIC和SPI 关于前两个的介绍在之前文章学习过 xff0c 这次介绍一下第三个通信协议 SPI SPI Serial Peripheral Interface
  • 利用定时器的输出比较功能产生PWM驱动舵机

    一 定时器基本原理 首先我们来看一下ST官方给出的关于定时器的相关介绍 xff1a xff08 以STM32F103C8T6为例 xff09 STM32F103C8T6 含有 4 个 16 位定时器 xff0c 分别是一个高级定时器 TIM
  • ST-LINK固件升级

    关于st link固件升级注意的问题 在下载调试的过程中 xff0c 程序可能由于st link版本过旧而提示 command not supported 的错误 xff0c 这就要求我们升级st link固件才可以正常下载 但是在升级的过
  • 关于英伟达jetson nano的搭配双目摄像头跑ORB_SLAM2

    1 安装系统 按照商家给的资料安装 xff0c 将Ubuntu18 04LTS镜像拷贝到tf卡中 xff0c 插上jetson nano就可以安装了 2 系统设置 进入系统我先把系统语言设置为中文 xff0c 在右上角的设置中找到系统设置中
  • 双目摄像头(CSI-IMX219)的标定

    1 介绍 网上关于这类标定有挺多教程的 xff0c 但由于这个摄像头的特殊性 xff0c 所以不可能完全安装教程来走 目前来说有3种标定方法 xff1a ROS操作系统来标定 matlab标定 opencv标定 这三种方法我先试了用ROS来
  • 小学生学AD16(入门级别,看这篇就够了)

    1 软件安装 xff1a AD16的安装我就不多介绍了 xff0c csdn一搜一大把 要学一个软件 xff0c 那么软件安装是必经之路 xff0c 不要认为软件安装不重要 xff08 如果你的安装完之后桌面没快捷方式 xff0c 那么可以
  • Arduino串口绘图器双通道绘制

    Serial print val Serial print 34 34 Serial println muBiao 其实只用在两个变量之间加个 xff0c 就行了 参考网址 https www norwegiancreations com

随机推荐

  • 关于神舟笔记本TX8连副屏经常蓝屏的问题

    大概率是3060显卡驱动的问题 xff0c 可以试试重新安装显卡驱动 若还是不行就换个接口 xff0c 不要用hdim的接口 xff0c 那个是直接连3060的 换剩下两个的minidp接口其中一个 xff0c 第一个不要接 xff0c 那
  • 51单片机入门(小学生都能学会)

    序 xff1a 时隔一年 xff0c 我终于从二年级到三年级了 xff01 由于小学三年级这学期要学单片机 xff0c 故写下这篇笔记留下些什么 由于自己也是新手 xff0c 欢迎各位指出本文的各种错误 1 什么是51单片机 为什么要说这个
  • 解决使用WinScp连接Ubantu系统失败的问题---SSH无法连接

    起因 为了互通Linux系统和Windows系统的文件 xff0c 以更好的实现文件管理和资源共享 所以在查阅资料后 xff0c 使用WinScp xff0c WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端 它的
  • 小学生51系列之基础知识

    1 单片机的基本结构 说到基本结构 xff0c 就是指51单片机的硬件组成 51单片机由中央处理器CPU 储存器 定时器 I O端口 组成 其中储存器包含数据储存器 xff08 RAM xff09 和程序储存器 xff08 ROM xff0
  • ros 接入Livox Mid-70

    最近在研究3d避障激光 大疆Livox mid 70 xff0c 记录下接入过程 环境信息 xff1a Ubuntu 18 04 ros melodic 1 livox view 点云可视化 xff08 1 xff09 根据livox mi
  • ROS+opencv实践-二维码识别

    一 安装二维码识别的功能包 sudo apt span class token operator span get install ros span class token operator span melodic span class
  • C语言简单链表详细步骤详解

    43 链表 gt 小阿豪带你写链表 xff01 xff01 xff01 xff01 进入正文 span class token number 1 span 首先 xff0c 先想好自己要创建的链表格式以及最后的的显示界面 xff01 xff
  • 滚球控制系统详解 —— (附核心代码)

    最近练习了17年的国赛题 滚球控制系统 这里展示一下画圆 xff1a 观看完整视频点这里 接下来 xff0c 我来分享一下从搭整体结构到调试完的过程 这是我搭完的整体结构 xff08 缩小版 xff09 不管什么题 xff0c 结构部分还是
  • 【Linux网络编程】你了解TIME_WAIT状态吗?

    在Linux网络编程中 xff0c 我相信大多数人觉得最难理解的就是TCP中的TIME WAIT状态了吧 xff0c 那么TIME WAIT的概念到底是什么 xff0c 有几个类型呢 xff0c 以及在面试中经常会问到的TIME WAIT状
  • 【图解】八幅图带你轻松掌握八大排序(上):冒泡排序、选择排序、插入排序、快速排序

    在算法中 xff0c 八大排序算是最简单的也是重中之重 xff0c 所以掌握好八大排序的思想是非常重要的 xff0c 很多人学排序的时候会觉得似懂非懂 xff0c 本篇文章作者耗时两小时绘制了八大排序的详细图解 xff0c 让大家快速理解八
  • 最详细整理STL之vector基础

    前言 xff1a Vector是一种可以存储任意类型的动态数组 xff0c 属于序列式容器 xff0c 可以用sort对其进行排序 xff0c 底层数据结构是数组 xff0c 可以随机访问元素 Vectors 包含着一系列连续存储的元素 其
  • STL之vector扩容机制

    前言 大家好 xff0c 我是萝卜 上期结尾说到vector的push back操作一般情况下时间复杂度为O 1 xff0c 是否存在特殊情况 那么本期就讲讲vector在容器空间不足时进行push back操作会发生什么 vector作为
  • 求职嵌入式软件开发linux kernel/BSP leader/工程师职位

    个人工作说明 xff1a 目前从事linux系统网络设备的开发工作 xff0c 负责bootloader linux kernel文件系统 xff0c driver移植 xff0c 以及开源app移植 主要技能和过去的经验 xff1a 1
  • 【2023最新】计算机网络面试题【收藏持续更新】

    你好 xff0c 我是萝卜 xff0c 我会在本篇文章持续更新关于计算机网络的面试题 最新内容更新日期 xff1a 2023 04 11 基础 说一下计算机网络体系结构 网络体系结构一般有三种 xff1a ISO七层模型 xff0c TCP
  • UDP协议详解

    概述 xff1a UDP只在IP的数据报服务之上增加了两个最基本的服务 xff1a 复用和分用以及差错检测 UDP不保证可靠交付 xff0c 但是不意味着应用对数据的要求是不可靠的 xff0c 只是所有维护可靠性的工作可由用户在应用层完成
  • TCP传输可靠性保证机制之重传机制

    TCP重传机制 tcp重传机制包括超时重传 快速重传 带选择确认的重传 SACK 重复SACK 四种 超时重传 xff1a 超时重传是tcp协议保证数据可靠性的一个重要机制 原理是在发送某一个数据以后开启一个计时器 xff0c 在一定时间内
  • VSCode:终端控制台常用指令

    常用的指令 以下是一些在 Visual Studio Code 终端控制台中常用的指令 xff1a 1 清除终端 xff1a clear 2 列出当前目录中的文件和文件夹 xff1a ls 3 切换到指定目录 xff1a xff1a cd
  • Ubuntu18.04安装ROS时rosdep update报错解决办法

    在安装ros进行rosdep update时经常会报错 xff0c 有时候可以通过换网解决 xff0c 但从我安装那么多次的经验来看 xff0c 仅有一次换手机热点后更新成功了 xff0c 其他都是失败 xff0c 成功率太低 从网上搜到了
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信 xff08 Serial Communications xff09 实现单片机与电脑或者其它外设进行通信 xff0c 通信时只需两根线 xff08 TX xff0c RX xff09 就可以实现数据传输 STM32f103有三个串
  • C语言学习笔记——(2)数组

    数组 1 什么是是数组2 数组的定义2 1数组的表达2 2数组的含义2 3数组的大小 xff1a 3 字符数组4 字符串操作5 二维数组 1 什么是是数组 数组是指有序的元素序列 如果将有限个类型相同的变量的集合命名 xff0c 那么这个名