C语言【数组】

一、数组基本语法

1. 什么是数组

数组是c语言的一种数据结构,用于存储一组具有相同数据类型的数据;

数组中每个元素可以通过下标进行访问,索引从0开始,最大值为数组长度-1。

2. 数组的使用 

类型 数组名[元素个数];
int arr[5];

下标从0开始 因此5个元素分别是arr[0],arr[1],arr[2],arr[3],arr[4]

数组名不能与其他变量名相同,同一作用域内是唯一的。 

#include <stdio.h>int main() {// 定义了一个数组,名字叫a,有10个成员,每个成员都是int类型int a[10]; // a[0]…… a[9],没有a[10]// 没有a这个变量,a是数组的名字,但不是变量名,它是常量a[0] = 0;// ……a[9] = 9;// 数据越界,超出范围,错误// a[10] = 10;  // errfor (int i = 0; i < 10; i++) {a[i] = i; // 给数组赋值}// 遍历数组,并输出每个成员的值for (int i = 0; i < 10; i++) {printf("%d ", a[i]);}printf("\n");return 0;
}

3. 数组的初始化

在定义数组的同时进行赋值,称为初始化

全局数组若不初始化,编译器将其初始化为零

局部数组若不初始化,内容为随机值

    int a1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 定义一个数组,同时初始化所有成员变量int a2[10] = { 1, 2, 3 }; // 初始化前三个成员,后面所有元素都设置为0int a3[10] = { 0 }; // 所有的成员都设置为0// []中不定义元素个数,定义时必须初始化int a4[] = { 1, 2, 3, 4, 5 }; // 定义了一个数组,有5个成员

4. 数组名

数组名是一个地址的常量,代表数组中首元素的地址

#include <stdio.h>int main() {// 定义一个数组,同时初始化所有成员变量int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 数组名是一个地址的常量,代表数组中首元素的地址printf("a = %p\n", a);printf("&a[0] = %p\n", &a[0]);int n = sizeof(a);     // 数组占用内存的大小,10个int类型,10 * 4  = 40int n0 = sizeof(a[0]); // 数组第0个元素占用内存大小,第0个元素为int,4int num = n / n0;      // 元素个数printf("n = %d, n0 = %d, num = %d\n", n, n0, num);return 0;
}

二、数组和指针

数组名字是数组的首元素地址,它是一个常量;

*和[]一样,都是操作指针所指向的内存

#include <stdio.h>int main() {int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int i = 0;int n = sizeof(a) / sizeof(a[0]);for (i = 0; i < n; i++) {// * 和 [] 效果一样,都是操作指针所指向的内存// printf("%d, ", a[i]);printf("%d, ", *(a + i));}printf("\n");// 定义一个指针变量保存a的地址int *p = a; for (i = 0; i < n; i++) {// printf("%d, ", p[i]);printf("%d, ", *(p + i));}printf("\n");return 0;
}

1. 指针数组

数组的每个元素都是指针类型

#include <stdio.h>int main() {// 指针数组int *p[3];int a = 1;int b = 2;int c = 3;// 指针变量赋值p[0] = &a;p[1] = &b;p[2] = &c;for (int i = 0; i < sizeof(p) / sizeof(p[0]); i++) {printf("%d, ", *(*(p + i)));// printf("%d, ", *(p[i]));}printf("\n");return 0;
}

2. 数组名做函数参数

函数做函数参数,函数的形参本质上就是指针

#include <stdio.h>// 下面3种写法完全等价
// void print_arr(int a[10], int n)
// void print_arr(int a[], int n)
void print_arr(int *a, int n) {int i = 0;for (i = 0; i < n; i++) {printf("%d, ", a[i]);}printf("\n");
}int main() {int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int n = sizeof(a) / sizeof(a[0]);// 数组名做函数参数print_arr(a, n);return 0;
}

三、字符数组与字符串

1. 字符数组与字符串区别

c语言中没有字符串,可以通过char的数组来代替

数字0(等于字符'\0')结尾的char就是字符串,字符串是一中特殊的char的数组

如果char字符中没有以0结尾 那么就不是一个字符串 是普通的字符数组

#include <stdio.h>int main() {char c1[] = {'c', ' ', 'p', 'r', 'o', 'g'}; // 普通字符数组printf("c1 = %s\n", c1);                    // 有可能乱码,因为没有'\0'结束符// 以'\0'('\0'就是数字0)结尾的字符数组是字符串char c2[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0'};printf("c2 = %s\n", c2);// 字符串处理以'\0'(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出char c3[] = {'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0'};printf("c3 = %s\n", c3);// 使用字符串初始化,编译器自动在后面补0,常用char c4[] = "c prog";printf("c4 = %s\n", c4);return 0;
}

2. 字符串的输入输出

#include <stdio.h>int main()
{char str[100];printf("input string1: ");// scanf("%s",str) 默认以空格分隔// 可以输入空格gets(str);printf("output: %s\n", str);return 0;
}

3. 字符指针

字符指针可直接赋值为字符串 保存的实际是字符串的首地址;

字符串指向的内存不能更改 指针变量本身可以更改

#include <stdio.h>int main() {char *p = "hello";  // 和 const char *p = 'hello' 等价,有没有const都一样// 指针变量所指向的内存不能修改// *p = 'a';    // errprintf("p = %s\n", p);// 指针变量可以修改p = "world";printf("p = %s\n", p);return 0;
}

4. 字符串常用库函数

4.1 strlen

#include <stdio.h>
#include <string.h>
// size_t strlen(const char *s);
// 功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0’
// 参数:
//	s:字符串首地址
// 返回值:字符串s的长度,size_t为unsigned int类型,不同平台会不一样int main() {char str[] = "abcdefg";int n = strlen(str);printf("n = %d\n", n);    // n = 7return 0;
}

4.2 strcpy

#include <stdio.h>
#include <string.h>// char *strcpy(char *dest, const char *src);
// 功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去
// 参数:
//	dest:目的字符串首地址,如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况
//	src:源字符首地址
// 返回值:
//	成功:返回dest字符串的首地址
//	失败:NULLint main() {char dest[20] = "123456789";char src[] = "hello world";strcpy(dest, src);printf("%s\n", dest);    // hello worldreturn 0;
}

4.3 strcat

#include <stdio.h>
#include <string.h>// char *strcat(char *dest, const char *src);
// 功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
// 参数:
//	dest:目的字符串首地址
//	src:源字符首地址
// 返回值:
//	成功:返回dest字符串的首地址
//	失败:NULLint main() {char str[20] = "123";char *src = "hello world";strcat(str, src);printf("%s\n", str);    // 123hello worldreturn 0;
}

4.4 strcmp

#include <stdio.h>
#include <string.h>// int strcmp(const char *s1, const char *s2);
// 功能:比较 s1 和 s2 的大小,比较的是字符ASCII码大小。
// 参数:
//	s1:字符串1首地址
//	s2:字符串2首地址
// 返回值:
//	相等:0
//	大于:>0
//	小于:<0int main() {char *str1 = "hello world";char *str2 = "hello mike";if (strcmp(str1, str2) == 0) {printf("str1==str2\n");} else if (strcmp(str1, str2) > 0) {printf("str1>str2\n");} else {printf("str1<str2\n");}// str1>str2return 0;
}

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

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

相关文章

ICV:《中美量子产业融资比较分析》

近日&#xff0c;全球前沿科技咨询公司ICV发布了A Comparative Analysis of Quantum Industry Financing in the U.S and China&#xff08;美国和中国量子产业融资比较分析&#xff09;报告。该报告旨在对中美两国在量子技术领域的投融资情况进行比较分析&#xff0c;探讨其差…

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示16行点x64列点字模串的应用

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示16行点x64列点字模串的应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显…

MySQL 试图

视图功能在 5.0 以后的版本启用 视图是一张虚表。数据表确实包含了具体数据并且保存到硬盘中的实表。视图使用数据检索语句动态生 成的一张虚表。每一次数据服务重启或者系统重启之后&#xff0c;在数据库服务启动期间&#xff0c;会使用创建视图的语 句重新生成视图中的数据&…

详解UART通信协议以及FPGA实现

文章目录 一、UART概述二、UART协议帧格式2.1 波特率2.2 奇校验ODD2.3 偶校验EVEN 三、UART接收器设计3.1 接收时序图3.2 Verilog代码3.3 仿真文件测试3.4 仿真结果3.5 上版测试 四、UART发送器设计4.1 发送时序图4.2 Verilog代码4.3 仿真文件测试4.4 仿真结果4.5 上板测试 五、…

用html画一个睡觉的熊动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>睡觉的熊动画</title><link rel"stylesheet" href"./style.css"> </head><body><div id"contain…

免费的 ChatGPT、GPTs、AI绘画(国内版)

&#x1f525;博客主页&#xff1a;白云如幻❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚…

袁庭新ES系列14节 | 搭建Elasticsearch集群

前言 单节点的Elasticsearch需要在处理大量数据的时候需要消耗大量内存和CPU资源&#xff0c;数据量大到一定程度就会产生处理瓶颈&#xff0c;甚至会出现宕机。 为了解决单节点ES的处理能力的瓶颈及单节点故障问题&#xff0c;我们考虑使用Elasticsearch集群。接下来袁老师带…

【前后端的那些事】SpringBoot 基于内存的ip访问频率限制切面(RateLimiter)

文章目录 1. 什么是限流2. 常见的限流策略2.1 漏斗算法2.2 令牌桶算法2.3 次数统计 3. 令牌桶代码编写4. 接口测试5. 测试结果 1. 什么是限流 限流就是在用户访问次数庞大时&#xff0c;对系统资源的一种保护手段。高峰期&#xff0c;用户可能对某个接口的访问频率急剧升高&am…

记录一下易语言post get使用WinHttp的操作

最近在学易语言&#xff0c;在进行通讯的时候&#xff0c;出现一些问题&#xff0c;现在记录下来&#xff0c;避免以后继续忘记&#xff0c; 先声明文本型变量jsonPostData jsonPostData &#xff1d; “{hostname:” &#xff0b; hostnameTxt &#xff0b; “,hardcode:” &…

【ARM 裸机】I.MX 启动方式之启动头文件 2

接上一节&#xff1a;【ARM 裸机】I.MX 启动方式之启动头文件 1&#xff1b; 2.3、DCD DCD&#xff0c;Device Configuration Data &#xff0c;就是配置 6ULL 寄存器的&#xff0c;DCD 数据最大限制 1768 字节&#xff1b; CCGR0 是不是很熟悉&#xff1f;对&#xff0c;在…

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

AI智能体技术突破:引领科技新浪潮

AI智能体技术突破&#xff1a;引领科技新浪潮 基于大模型的 AI Agent 工作流基于大模型的 AI Agent 工作流效果AI Agent 的四种设计模式Reflection 反思设计模式Tool use 工具使用设计模式Planning 规划设计模式Multiagent collaboration 多智能体协作设计模式 吴恩达在红杉美国…

Flink CDC在阿里云DataWorks数据集成应用实践

摘要&#xff1a;本文整理自阿里云 DataWorks 数据集成团队的高级技术专家 王明亚&#xff08;云时&#xff09;老师在 Flink Forward Asia 2023 中数据集成专场的分享。内容主要为以下四部分&#xff1a; 阿里云 DataWorks 数据集成介绍基于 Flink CDC 数据集成新版引擎架构和…

【鸿蒙开发】生命周期

1. UIAbility组件生命周期 UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。 UIAbility生命周期状态 1.1 Create状态 Create状态为在应用加载过程中&#xff0c;UIAbility实例创建完成时触发&#xff0c;系统会调用onCreate()回调。可以在该回调中…

会议室预约小程序开源版开发

会议室预约小程序开源版开发 支持设置免费预约和付费预约、积分兑换商城、积分签到等 会议室类目&#xff0c;提供多种类型和设施的会议室选择&#xff0c;满足不同会议需求。 预约日历&#xff0c;展示会议室预约情况&#xff0c;方便用户选择空闲时段。 预约记录&#xff0…

秋招复习笔记——八股文部分:网络基础

TCP/IP 网络模型 应用层 最上层的&#xff0c;也是我们能直接接触到的就是应用层&#xff08;Application Layer&#xff09;&#xff0c;我们电脑或手机使用的应用软件都是在应用层实现。那么&#xff0c;当两个不同设备的应用需要通信的时候&#xff0c;应用就把应用数据传…

java绘图在ubuntu报错

把JRT网站部署到ubuntu桌面系统上&#xff0c;开始没测试绘图部分功能&#xff0c;只试了连PostGreSql部分正常。后面试了生成位图部分发现报错。 报下面错误&#xff1a; (ColorModel.java:220)\n\tat java.desktop/java.awt.image.BufferedImage.(BufferedImage.java:286)\n…

windows Webrtc +VS2019 (M124)下载编译以及调通测试demo

下载depot tools 设置梯子 git config --global http.proxy 127.0.0.1:10000 git config --global https.proxy 127.0.0.1:10000 下载 $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 设置depot_tools目录为环境变量 下载webrtc # 设置系统代…

2024年4月最新版GPT

2024年4月最新版ChatGPT/GPT4, 附上最新的使用教程。 随着人工智能技术的不断发展&#xff0c;ChatGPT和GPT4已经成为了人们日常生活中不可或缺的助手。2024年4月,OpenAI公司推出了最新版本的GPT4,带来了更加强大的功能和更加友好的用户体验。本文将为大家带来最新版GPT4的实用…

微软提供用于测试框架的SDK

微软发布了 MSTest SDK。 MSTest SDK基于 MSBuild Project SDK 系统构建并基于MSTest 运行程序&#xff0c;旨在为开发人员提供更好的使用 Microsoft 单元测试框架 MSTest 进行测试的体验。 微软表示&#xff0c; 4 月 11 日发布的MSTest SDK通过合理的默认设置和灵活的选项使…