C语言进阶-数组和函数
C语言
一、数组
一维数组
通过数组,可以一次性的分配多个同类型的连续存储区
语法:
类型 数组名字[元素个数]; 例:int arr[6]; arr占用内存6个整型大小的连续存储空间
注意:
通过下标可以区分数组的每个元素
c语言数组下标从0开始,没有负数
下标从0开始,一次加一
arr[0] 表示数组中第一个元素
数组的每个元素都可以独立的使用
***数组在使用时,要注意下标的范围,避免越界***
每次程序运行,数组所占用的内存空间可能都不一样,这要看系统分配的内存位置
数组初始化
int arr[5] = {10, 20, 30, 40, 50}; // arr[0] = 10, arr[1] = 20, ......
int arr[5] = {0}; // arr[0] = 0, arr[1] = 0,... 五个元素均为0
int arr[5] = {}; // arr[0] = 0, arr[1] = 0,... 五个元素均为0
int arr[5] = {1,2}; // arr[0] = 1, arr[1] = 2, arr[2] = 0,除了前两个有值,后面均为0
int arr[] = {1,2,3,4,5}; //不定义元素个数,默认为后面花括号中元素的实际个数
使用memset初始化
int arr[5];
memset(arr, 0, sizeof(arr)); // sizeof 获取arr数组的大小,这里是将5个元素都设为0,这里memset常用语结构体
// 以下是接收键盘输入的7个学生的成绩,计算总成绩和平均分
#include <stdio.h>
int main(void)
{
float arr[7] = {0};
float sum = 0;
for (int i = 0; i < 7; i++) {
printf("请输入第%d个同学的成绩:", i+1);
scanf("%f", &arr[i]);
sum += arr[i];
}
float average = sum / 7;
printf("总成绩 = %g, 平均分 = %g\n", sum, average);
return 0;
}
二维数组
二维数组中的每个元素都是一维数组,也就是说二维数组是由多个长度相同的一维数组构成的
语法:
数据类型 数组名[分组个数][每组的元素个数]
int arr[2][2]; // 由两个长度为2的一维数组构成
注意:
二维数组中的每个存储区通过组下标(分组个数) 和 组内下标(一维数组的元素下标) 共同确定
组下标表示具体的分组,从0开始,依次加一
组内下标表示一组内的具体某个元素对应的下标,从0开始,依次加一
arr[1][0]; 表示第二组中第一个元素
二维数组初始化
未初始化,如上int arr[2][2]; 每个里面的元素在未初始化时,都是随机数
初始化方法:
标准初始化:
int arr[2][2] = {{10,20},{30,40}}; // arr[0][0] = 10 arr[0][1] = 20 arr[1][0] = 30 arr[1][1] = 40
初始化0:
int arr[2][2] = {};
int arr[2][2] = {{0}, {0}};
int arr[2][2] = {{0}};
其他初始化:
int arr[3][3] = {{1,2,3},{1,2},{1}}; // 当给数值不全,不全的元素默认设为0
// arr[0][0~2] 1,2,3 arr[1][0~2] 1,2,0 arr[2][0~2] 1,0,0
int arr[3][3] = {1,2,3,4,5,6,7,8,9}; // 如果每个每组没有花括号{}区分,name则按照顺序,每个分组依次读取单个组的元素个数作为本组元素
// arr[0][0~2] 1,2,3 arr[1][0~2] 4,5,6 arr[2][0~2] 7,8,9
memset方法:
int arr[2][2];
memset(arr,0,sizeof(arr)); // sizeof 获取arr数组的大小,这里是将二维数组的每个元素都设为0,这里memset常用语结构体
例:
#include <stdio.h>
#include <string.h>
int main(void)
{
// 定义二维数组
int arr[4][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}, {4,5,6,7,8,9}};
memset(arr, 0, sizeof(arr));
for (int i = 0; i < 4; i++) {
for (int j = 0; j <5; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
二、C语言-函数
C语言程序,由函数构成,函数是C代码的基本单位
无论C语言程序有多少个函数,一定有且只有一个main函数
函数
函数:是一堆语句的组合,具有独立性和通用性,可以将指定功能封装进函数里面。
目的:将重复的操作或者公共的操作,代码只写一次,封装为函数,在需要该操作时,直接调用函数即可,无需再写一遍代码。
比如五子棋,每次落子后,都要重新绘制棋盘,绘制棋盘的代码就可以封装成函数,当需要绘制棋盘的时候,就直接调用函数即可,不需要重复写绘制棋盘代码。
语法:
返回值类型 函数名(参数列表) {
功能代码语句;
}
void 作为返回值和参数列表的话,则表示该函数无返回值,无参数列表。
参数列表可以有多个,根据功能需求设计即可。
传入的参数保证需函数功能代码需要的,不要添加无效参数。
语法如下:
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, 参数类型3 参数名3,...)
注意:
一维数组作为参数,例如 fun(int *array, int len) 或者 fun(int array[], int len) 或者 fun(int array[5], int len)
// 当数组作为参数时,一般会多加一个参数,表示数组的长度
二维数组作为参数,例如fun(int arr[][10], int len) 二维数组的列数即第二个中括号的数值,必须指定,否则报错,len 作为行数,即第一个中括号的数值
例:
// 该函数返回值为int类型,函数名为findmax,参数为 int指针类型(可表示数组 或者 int类型变量的地址) 和 int类型的数组长度,
// 功能模块代码就是找数组中最大值,找出最大值后返回,返回值类型为int
// 每当有需要找数组中最大值的功能,都随时可以调用该函数使用
#include <stdio.h>
// 函数的参数也成为形参,即形式上的参数,规定了函数需要的参数类型,当调用函数时,传入的参数会赋值给形参
int findmax(int* arr, int len)
{
int max = arr[0];
for (int i = 1; i < len; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main(void)
{
int arr[5] = {1,5,77,8,9};
int arr1[6] = {1,4,7,9,22,5};
// 这里findmax(arr, 5) 传入的是实参,相当于 将 main函数里的arr赋值给findmax函数形参中的arr,5赋值给findmax函数形参中的len
printf("arr max = %d\n", findmax(arr, 5));
printf("arr1 max = %d\n", findmax(arr1, 6));
return 0;
}
函数的声明
代码执行顺序:从main函数开始,到return结束
代码编译顺序:gcc按照从上到下的顺序,逐行编译的
当调用函数的语句在函数实现的前面时,编译就会报错,找不到函数,warning: implicit declaration of function
这时可以先声明一下,函数实现可以放后面实现,相当于先给编译器打个招呼,说我有这个函数,后面会实现,调用的时候别给我报错
例
#include <stdio.h>
//函数声明
int mul(int, int);
int main(void) {
// 函数调用
printf("3 * 5 = %d\n", add(3,5));
return 0;
}
// 函数实现
int add(int a, int b) {
return a * b;
}
相关文章:
C语言进阶-数组和函数
C语言 一、数组 一维数组 通过数组,可以一次性的分配多个同类型的连续存储区 语法: 类型 数组名字[元素个数]; 例:int arr[6]; arr占用内存6个整型大小的连续存储空间 注意: 通过下标可以区分数组的每个…...

图片通过滑块小图切换大图放大镜效果显示(Vue3)
图片通过滑块小图切换大图放大镜效果显示 实现目标: 显示一组图片列表,鼠标进入小图记录当下小图下标,通过小图下标在数组中对应图片显示到大图位置; 鼠标进入大图位置时,带动滑块移动,并将放大两倍的大图…...

[SSL]1Panel添加阿里云DNS账户
1 创建一个子用户 将得到的key和secret贴到1panel的DNS账户配置中 添加权限 即可用DNS账号申请SSL证书...
C语言编程中的时间处理
最简单的time 在C语言编程中,处理时间最简单的函数就是time了。它的原型为: #include <time.h> time_t time(time_t *_Nullable tloc);返回自从EPOCH,即1970年1月1日的零点零时零分,到当前的秒数。 输入参数可以是NULL。…...

计算机网络 : 网络基础
计算机网络 : 网络基础 目录 计算机网络 : 网络基础引言1. 网络发展背景2. 初始协议2.1 初始协议2.2 协议分层2.2.1 软件分层的好处2.2.2 OSI七层模型2.2.3 TCP/IP五层(四层)模型 2.3 TCP/IP协议2.3.1TCP/IP协议与操作系统的关系&…...

C++跨平台开发:突破不同平台的技术密码
Windows 平台开发经验 开发环境搭建 在 Windows 平台进行 C 开发,最常用的集成开发环境(IDE)是 Visual Studio。你可以从Visual Studio 官网下载安装包,根据安装向导进行安装。安装时,在 “工作负载” 界面中ÿ…...
实现 STM32 PWM 输出:原理、配置与应用详解
实现 STM32 PWM 输出:原理、配置与应用详解 在嵌入式开发领域,STM32 微控制器凭借其强大的功能和丰富的外设资源,被广泛应用。PWM(脉冲宽度调制)作为 STM32 的重要功能之一,对于电机调速、LED 调光、信号合…...
Web 架构之负载均衡会话保持
文章目录 一、引言二、思维导图三、负载均衡会话保持的概念3.1 定义3.2 作用 四、负载均衡会话保持的实现方式4.1 基于 IP 地址原理代码示例(以 Nginx 为例)注释 4.2 基于 Cookie原理代码示例(以 HAProxy 为例)注释 4.3 基于 SSL …...

第一次做逆向
题目来源:ctf.show 1、下载附件,发现一个exe和一个txt文件 看看病毒加没加壳,发现没加那就直接放IDA 放到IDA找到main主函数,按F5反编译工具就把他还原成类似C语言的代码 然后我们看逻辑,将flag.txt文件的内容进行加…...

【Linux网络】传输层协议TCP
TCP协议 TCP全称为"传输控制协议(TransmissionControl Protocol"). 人如其名, 要对数据的传输进行一个详细的控制; TCP协议段格式 源、目的端口号:表示数据从哪个进程来,到哪个进程去。 32位序号、确认序号 4位TCP报头长度:表示该TCP头部有…...

AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
作者:Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所模式识别与智能系统实验室,穆罕默德本扎耶德人工智能大学࿰…...

排序算法之基础排序:冒泡,选择,插入排序详解
排序算法之基础排序:冒泡、选择、插入排序详解 前言一、冒泡排序(Bubble Sort)1.1 算法原理1.2 代码实现(Python)1.3 性能分析 二、选择排序(Selection Sort)2.1 算法原理2.2 代码实现ÿ…...

Linux常用命令42——tar压缩和解压缩文件
在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。tar 名字来自 "tape archive"(磁带归档),最初用于将文件打包到磁带…...

网络协议分析 实验七 FTP、HTTP、DHCP
文章目录 实验7.1 FTP协议练习二 使用浏览器登入FTP练习三 在窗口模式下,上传/下传数据文件实验7.2 HTTP(Hyper Text Transfer Protocol)练习二 页面提交练习三 访问比较复杂的主页实验7.3 DHCP(Dynamic Host Configuration Protocol) 实验7.1 FTP协议 dir LIST&…...

HTML 表格与div深度解析区别及常见误区
一、HTML<div>元素详解 <div>是HTML中最基本的块级容器元素,本身没有语义,主要用于组织和布局页面内容。以下是其核心用法: 1. 基础结构与特性 <div><!-内部可包含任意HTML元素 --><h2>标题</h2><p…...
Linux 系统中设置开机启动脚本
Linux 系统中设置开机启动脚本有多种方法,适用于不同的场景和需求。以下是几种最常用且详细的方法: 核心理念: 无论哪种方法,核心都是让系统在启动过程中的某个阶段执行你的脚本。 1. 使用 systemd (推荐,现代 Linux 发行版的标准) systemd 是目前大多数主流 Linux 发行…...

linux-进程信号的产生
Linux中的进程信号(signal)是一种用于进程间通信或向进程传递异步事件通知的机制。信号是一种软中断,用于通知进程某个事件的发生,如错误、终止请求、计时器到期等。 1. 信号的基本概念 - 信号(Signal)&am…...

内容中台重构企业知识管理路径
智能元数据驱动知识治理 现代企业知识管理的核心挑战在于海量非结构化数据的有效治理。通过智能元数据分类引擎,系统可自动识别文档属性并生成多维标签体系,例如将技术手册按产品版本、功能模块、适用场景进行动态标注。这种动态元数据框架不仅支持跨部…...
ubuntu22.04卸载vscode
方法 1:通过 Snap 卸载 VSCode 如果你是通过 Snap 安装的 VSCode(Ubuntu 22.04 默认推荐方式),按照以下步骤卸载: 检查是否通过 Snap 安装: bash snap list | grep code如果输出显示 code,说明…...
AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)
1 安装模块 魔塔社区提供了下载的模块,如下: pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple 2 模型下载 from modelscope import snapshot_download model_dirsnapshot_download(LLM-Research/Meta-Llama-3-8B,cache_dirrD:\…...

基于Spring Boot+Layui构建企业级电子招投标系统实战指南
一、引言:重塑招投标管理新范式 在数字经济浪潮下,传统招投标模式面临效率低、透明度不足、流程冗长等痛点。本文将以Spring Boot技术生态为核心,融合Mybatis持久层框架、Redis高性能缓存及Layui前端解决方案,构建一个覆盖招标代理…...

Kali安装详细图文安装教程(文章内附有镜像文件连接提供下载)
Kali镜像文件百度网盘:通过网盘分享的文件:kali-linux-2024.2-installer-amd64.iso 链接: https://pan.baidu.com/s/1MfCXi9KrFDqfyYPqK5nbKQ?pwdSTOP 提取码: STOP --来自百度网盘超级会员v5的分享 1.下载好镜像文件后,我们打开我们的VMwa…...

2.4GHz无线芯片核心技术解析与典型应用
2.4G芯片作为工作在2.4GHz ISM频段的无线通信集成电路,主要面向短距离数据传输应用。这类芯片具有以下技术特点: 多协议支持 兼容蓝牙、Wi-Fi和ZigBee等主流协议 采用SDR技术实现协议灵活切换 适用于智能家居和物联网设备 低功耗特性 采用休眠唤醒和动态…...
ai agent(智能体)开发 python高级应用4:什么是代理,如何设置squid代理服务器,让crawl4ai 0.6.3 用上代理,获取到数据平权
crawl4ai 0.6.3为啥用代理,什么情况下需要用到代理 在 crawl4ai 中设置代理服务器的好处: 一、设置代理的好处 避免IP封禁 高频请求同一网站时,目标服务器可能封禁真实IP。代理通过轮换IP分散请求,降低封禁风险。 绕过地理限制 …...
技术融资:概念与形式、步骤与案例、挑战与应对、发展趋势
一、技术融资概述 技术融资是指通过外部资金支持技术研发、产品开发或市场扩展的过程。它通常涉及风险投资、天使投资、私募股权、众筹等多种形式。技术融资的核心目标是为技术创新提供资金保障,推动技术从概念到市场的转化。 技术融资的主要形式包括以下几种&…...

Chrome代理IP配置教程常见方式附问题解答
在网络隐私保护和跨境业务场景中,为浏览器配置代理IP已成为刚需。无论是访问地域限制内容、保障数据安全,还是管理多账号业务,掌握Chrome代理配置技巧都至关重要。本文详解三种主流代理设置方式,助你快速实现精准流量管控。 方式一…...
微信小程序 密码框改为text后不可见,需要点击一下
这个问题是做项目的时候碰到的。 密码框常规写法: <view class"inputBox"><view class"input-container"><input type"{{inputType}}" placeholder"请输入密码" data-id"passwordValue" bindin…...
LLM笔记(六)线性代数
公式速查表 1. 向量与矩阵:表示、转换与知识存储的基础 向量表示 (Vectors): 语义的载体 在LLM中,向量 x ∈ R d \mathbf{x}\in\mathbb{R}^d x∈Rd 是信息的基本单元,承载着丰富的语义信息: 词嵌入向量 (Word Embeddings)&am…...

Linux——UDP/TCP协议理论
1. UDP协议 1.1 UDP协议格式 系统内的UDP协议结构体: 注1:UDP协议的报头大小是确定的,为8字节 注2:可以通过报头中,UDP长度将UDP协议的报头和有效载荷分离,有效载荷将存储到接收缓冲区中等待上层解析。 注…...

Go语言爬虫系列教程(一) 爬虫基础入门
Go爬虫基础入门 1. 网络爬虫概念介绍 1.1 什么是网络爬虫 网络爬虫(Web Crawler),又称网页蜘蛛、网络机器人,是一种按照一定规则自动抓取互联网信息的程序或脚本。其核心功能是模拟人类浏览网页的行为,通过发送网络…...