C语言——数组、sizeof关键字

一、数组

1.数组的引入与定义: 

C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。数组中的每个元素可以通过索引来访问,索引通常是一个整数,用于指定元素在数组中的位置。在C语言中,数组索引是从0开始的。

 要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中有多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数组处理。例如,下面是对数组的定义:

type arrayName[arraySize];
  • type 指定数组中元素的类型(如 intfloatchar 等)。
  • arrayName 是数组的名称。
  • arraySize 是数组中元素的数量,它必须是一个常量表达式,并且指定了数组的大小。

2.数组的初始化:

(1)全部赋值

在定义数组时对全部数组元素赋予初值。例如:

int a[10] = {0,1,2,3,4.5,6,7.8,9};


将数组中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。花括号内的数据就称为“初始化列表”。经过上面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。

(2)部分赋值

 可以只给数组中的一部分元素赋值。例如:

int a[10]={0,1,2,3,4};

定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元赋初值,系统自动给后5个元素赋初值为0。

(3)初始化为0

如果想使一个数组中全部元素值为0,可以写成

int a[10]={0,0,0,0,0,0,0,0,0,0};

int a[10] = {0};     //未赋值的部分元素自动设为0
(4)不定义数据长度

在C语言中,可以在声明数组的同时初始化它,例如:

int numbers[] = {1, 2, 3, 4, 5};  
char letters[] = {'a', 'b', 'c', 'd', 'e'};

注意,如果在声明时初始化数组但未指定大小,编译器会自动根据初始化列表中元素的数量来确定数组的大小。

3.访问数组元素:

通过指定数组的索引(位置)来访问数组中的元素,例如:

int secondNumber = numbers[1]; // 访问 numbers 数组中的第二个元素(索引为1)  
char firstLetter = letters[0]; // 访问 letters 数组中的第一个元素(索引为0)

4.数组的遍历:

遍历数组即访问数组中的每个元素。这通常通过循环实现,例如使用 for 循环:

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

这段代码会打印出 numbers 数组中的所有元素。

5.简单示例:

#include<stdio.h>int main()
{int data = 1;int array[]={0,0,0,0,0};int arraySize;for(int i = 0;i < 5;i++){array[i] = data + 10;data++;printf("array[%d]address=%p,array[%d]=%d\n",i,&array[i],i,array[i]);}arraySize = sizeof(array)/sizeof(array[0]);printf("数组array的长度为:%d",arraySize);return 0;
}

输出将是:

array[0]address=000000000061FE00,array[0]=11
array[1]address=000000000061FE04,array[1]=12
array[2]address=000000000061FE08,array[2]=13
array[3]address=000000000061FE0C,array[3]=14
array[4]address=000000000061FE10,array[4]=15
数组array的长度为:5

由此我们可以看出,数组中存放的数据的地址是连续的。

6.注意事项:

  • 数组的大小在声明时确定,并且之后不能改变。
  • 访问数组元素时,索引必须在有效范围内(即 0 到 arraySize - 1)。如果尝试访问超出这个范围的元素,将会导致未定义行为,通常是程序崩溃。
  • 在C语言中,数组名通常代表数组首元素的地址。因此,在某些上下文中,数组名可以被用作指向其第一个元素的指针。

数组是C语言中非常基本且强大的数据结构,它们允许我们 以紧凑和高效的方式处理一系列相同类型的数据。 

二、sizeof关键字

sizeof 是 C 语言(以及 C++、C# 等多种编程语言)中的一个操作符,用于在编译时计算对象或类型所占的内存空间大小(以字节为单位)。它返回的是一个无符号整数(size_t 类型),表示了请求的对象或类型在内存中占用的字节数。

1.使用方式:

sizeof 可以用于计算变量、类型、数组、结构体(包括联合体)、指针等的大小。其使用方式主要有两种:

  1. 计算变量或数组的大小sizeof(variable_name) 或 sizeof array_name。注意,对于数组,不论是否指定了数组索引,sizeof 返回的都是整个数组的大小。

  2. 计算类型的大小sizeof(type),其中 type 可以是基本数据类型(如 intfloatchar 等),也可以是用户定义的类型(如结构体、联合体等)。

2.示例:

#include <stdio.h>  int main() {  int a = 5;  char b = 'A';  double c = 3.14;  printf("Size of int: %zu bytes\n", sizeof(a));  printf("Size of char: %zu bytes\n", sizeof(b));  printf("Size of double: %zu bytes\n", sizeof(c));  // 数组示例  int arr[10];  printf("Size of arr: %zu bytes\n", sizeof(arr)); // 整个数组的大小  printf("Size of arr[0]: %zu bytes\n", sizeof(arr[0])); // 数组中单个元素的大小  // 结构体示例  struct MyStruct {  int x;  char y;  double z;  };  printf("Size of struct MyStruct: %zu bytes\n", sizeof(struct MyStruct));  return 0;  
}

输出将是:

Size of int: 4 bytes
Size of char: 1 bytes
Size of double: 8 bytes
Size of arr: 40 bytes
Size of arr[0]: 4 bytes
Size of struct MyStruct: 16 bytes

3.注意事项

  • sizeof 是在编译时计算的,因此其结果是一个常量表达式。
  • 对于指针,sizeof 返回的是指针本身的大小,而不是指针所指向的内存区域的大小。在不同的系统和编译器中,指针的大小可能不同(通常是 4 字节或 8 字节)。
  • 结构体(和联合体)的大小可能会受到内存对齐(padding)的影响,导致实际占用的内存大小大于其成员大小的总和。
  • 数组名在表达式中会被转换为指向数组首元素的指针,但只有在 sizeof 操作符中,数组名才表示整个数组的大小。

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

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

相关文章

北京服装学院学报-自然科学版

《北京服装学院学报》&#xff08;自然科学版&#xff09;创立于1981年&#xff0c;是由北京市教委主管、北京服装学院主办的自然科学类学术期刊&#xff08;国际刊号&#xff1a;ISSN1001-0564,国内刊号&#xff1a;CN11-2523/TS&#xff09;。学报为季刊&#xff0c;每年3、6…

【香橙派】Orange pi AIpro开发板评测,看小白如何从0到1快速入门,以及亲测手写数字识别模型训练与推理

作为业界首款基于昇腾深度研发的AI开发板&#xff0c;Orange Pi AIpro无论在外观上、性能上还是技术服务支持上都非常优秀。 接口丰富&#xff0c;扩展能力强。支持Ubuntu、openEuler操作系统&#xff0c;满足大多数AI算法原型验证、推理应用开发的需求。 目录 开发板介绍亮点顶…

【C++】C++中的友元函数详解

目录 一.友元函数介绍 二.友元函数的使用场景 三.友元函数的注意事项 一.友元函数介绍 友元函数&#xff08;Friend Function&#xff09;是C中的一个特殊概念&#xff0c;它允许非成员函数访问类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#x…

Laravel生成二维码图片

Laravel生成二维码图片 composer下载组件 https://github.com/SimpleSoftwareIO/simple-qrcode/tree/develop/docs/zh-cn composer require simplesoftwareio/simple-qrcode "~2"namespace App\Http\Controllers;use SimpleSoftwareIO\QrCode\Facades\QrCode;cla…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

代理IP如何选以及常见反爬策略 为什么需要代理&#xff1f; 因为有的网站会封IP&#xff0c;用户如果没有登录&#xff0c;那IP就是身份标识&#xff0c;如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求&#xff0c;帮你转交的人对面不熟&a…

【机器学习】线性判别分析(LDA):从理论到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 线性判别分析&#xff08;LDA&#xff09;&#xff1a;从理论到实践LDA的基本概…

c++ - 多态

文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念 1、概念&#xff1a; 多态就是具有多种形态&#xff0c;可以理解为同一个行为不同对象去完成表现出不同的状态&#xff0c;如&#xff1a; 二、多态使用 1、构成多态的条件 &#xff08;1&#xff09;派…

SpringCloud01_技术选型、生态底层、整合knife4j - swagger3、支付模块、订单模块、热部署Devtools(开发阶段)

文章目录 ①. 从Boot和Cloud版本选型②. SpringCloud生态底层③. 整合knife4j - swagger3④. 父工程项目搭建⑤. 支付微服务 - 8001⑥. 订单微服务 - consumer80⑦. 热部署Devtools(开发阶段)⑧. 测试Run DashBord ①. 从Boot和Cloud版本选型 ①. 结论:本次Java、cloud、boot…

程序的控制结构——switch语句【互三互三】

文章目录 &#x1f341; 引言 &#x1f341;1.语句格式&#xff1a; &#x1f341;2.语句执行过程 &#x1f341;3.语句格式举例 &#x1f341;例题 &#x1f449;【例1】 &#x1f680;示例代码 &#x1f449;【例2】 &#x1f680;【分析】 &#x1f680;示例代码…

【企业级监控】Zabbix实现邮箱报警

Zabbix监控自动化 文章目录 Zabbix监控自动化资源列表基础环境前言四、Zabbix邮件告警4.1、实现报警所需的条件4.1.1、告警媒介4.1.2、触发器&#xff08;trigger&#xff09;4.1.3、动作&#xff08;action&#xff09; 4.2、配置告警媒介4.2.1、设置告警媒介参数4.2.2、启用此…

卡码网KamaCoder 99. 岛屿数量

题目来源&#xff1a;99. 岛屿数量 C题解&#xff1a;来源代码随想录 懒得自己写了。直接搬运。。。 1. 深度优先搜索&#xff1a;它的循环在main函数里&#xff0c;遍历每个位置&#xff0c;判断 是否为陆地 及 是否访问过。 #include <iostream> #include <vecto…

docker 安装orcale11数据库

初次安装流程 1.拉取 oracle 11g 镜像&#xff08;有6g&#xff0c;要等较长的时间&#xff09;: docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g2.执行以下命令以创建并运行 Oracle 11g 容器&#xff08;其中&#xff1a;30026为映射主机端口&#xff0…

Python学习1---深浅拷贝

在Python中&#xff0c;当我们复制对象时&#xff0c;有两种主要的方式&#xff1a;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;。 一、浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝创建一个新对象&#xff0c;但是它包含的…

[1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)

电商智能助手进化论:AI Agent技术引领下的智能化升级与实战效果评估 1.LLM Agent 的整体概述 1.0 Agent 在学术界的热度持续攀升 人工智能应用的几个阶段LLM Agent 的构成要素 语言模型 (LLM) 仅限于它们所训练的知识,并且这些知识很快就会过时。且 LLM 具备以下缺点: 会产…

PG大会周五于杭州举办;Pika发布4.0;阿里云MySQL上线Zero-ETL集成能力

重要更新 1. PostgreSQL中国技术大会举行12日&#xff08;周五&#xff09;于杭州举办&#xff0c;是PostgreSQL社区年度的大会&#xff0c;举办地点&#xff1a;杭州君尚云郦酒店&#xff08;杭州市上城区临丁路1188号&#xff09;&#xff0c;感兴趣的可以考虑现场参加 ( [1]…

【公益案例展】华为云X《无尽攀登》——攀登不停,向上而行

‍ 华为云公益案例 本项目案例由华为云投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 夏伯渝&#xff0c;中国无腿登珠峰第一人&#xff0c;一生43年…

Guava LocalCache源码分析:LocalCache生成

Guava LocalCache源码分析&#xff1a;Cache生成 版本LocalCache参数说明Cache构建过程LocalCache介绍LocalCache实例化将builder中的属性赋值到LocalCache中分段 LocalCache为guava本地缓存的解决方案&#xff0c;提供了基于容量&#xff0c;时间和引用的缓存回收方式&#xf…

目标检测大揭秘:算法种类与优劣分析

目标检测大揭秘&#xff1a;算法种类与优劣分析&#x1f50d; 在当今这个信息爆炸的时代&#xff0c;图像识别技术正逐渐成为我们生活中不可或缺的一部分。目标检测作为图像识别领域的重要分支&#xff0c;已经广泛应用于安全监控、自动驾驶、智能家居等多个领域。今天&#x…

算法复杂度<数据结构 C版>

什么是算法复杂度&#xff1f; 简单来说算法复杂度是用来衡量一个算法的优劣的&#xff0c;一个程序在运行时&#xff0c;对运行时间和运行空间有要求&#xff0c;即时间复杂度和空间复杂度。 目录 什么是算法复杂度&#xff1f; 大O的渐近表达式 时间复杂度示例 空间复杂度…

Python向某个网页发起请求

在Python中&#xff0c;向某个网页发起请求最常用的库是requests。该库简单易用&#xff0c;支持HTTP的GET、POST、PUT、DELETE等方法。以下是如何使用requests库向网页发起请求的例子&#xff1a; 首先&#xff0c;你需要确保安装了requests库。如果你还没有安装&#xff0c;…