嵌入式第四天:(C语言入门)

目录

什么是数组?

数组:

数组的使用:

数组的初始化:

数组名:

数组案例:

一维数组的最大值:

一维数组的逆置:

数组和指针:

通过指针操作数组元素:

指针数组:

数组名做函数参数:

字符数组与字符串:

字符数组与字符串区别:

字符串的输入输出:

字符指针:

 字符串常用库函数:

strlen:

strcpy:

strcat:

 strcmp:

字符串案例:


什么是数组?

1. 数组是C语言中的一种数据结构,用于存储一组具有相同数据类型的数据。

2. 数组中的每个元素可以通过一个索引(下标)来访问,索引从0开始,最大值为数组长度减1。

数组:
数组的使用:

语法格式:

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

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

2. 其下标从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;
}
数组的初始化:

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

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

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个成员
数组名:

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

#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, 10};// 假设第0个元素就是最大值int temp = a[0];for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {// 如果有元素比临时的最大值大,就交换值if (a[i] > temp) {temp = a[i];}}printf("数组中最大值为:%d\n", temp);return 0;
}
一维数组的逆置:
#include <stdio.h>int main() {// 定义一个数组,同时初始化所有成员变量int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i = 0;  // 首元素下标int j = sizeof(a) / sizeof(a[0]) - 1;   // 尾元素下标int temp;while (i < j) {// 元素交换值temp = a[i];a[i] = a[j];a[j] = temp;// 位置移动i++;j--;}for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) {printf("%d, ", a[i]);}return 0;
}
数组和指针:
通过指针操作数组元素:

1. 数组名字是数组的首元素地址,但它是一个常量。

2. * 和 [] 效果一样,都是操作指针所指向的内存。

#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;
}
指针数组:

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

#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;
}
数组名做函数参数:

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

#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的数组来替代。

2. 数字0(和字符 '\0' 等价)结尾的char数组就是一个字符串,字符串是一种特殊的char的数组。

3. 如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组。

字符串的输入输出:

 由于字符串采用了'\0'标志,字符串的输入输出将变得简单方便。

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

1. 字符指针可直接赋值为字符串,保存的实际上是字符串的首地址。

2. 这时候,字符串指针所指向的内存不能修改,指针变量本身可以修改。

#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;
}
 字符串常用库函数:
strlen:

作用:

strlen 函数的作用是返回字符串的长度,即字符串中字符的个数,不包括末尾的空字符('\0')。

解释:

在C语言中,字符串是以字符数组的形式存储的,并且以空字符串('\0')作为结束标签。strlen函数通过遍历这个字符数组,直到遇到空字符为止,来计算字符串的长度。

函数原型:

size_t strlen(const char *str);

1. str是一个指向字符数组(字符串)的指针

2. 函数返回一个size_t 类型的值,表示字符串的长度。

示例:

#include <stdio.h>  
#include <string.h>  int main() {  char str[] = "Hello, World!";  printf("The length of the string is: %zu\n", strlen(str));  return 0;  
}

输出:

The length of the string is: 13

 注意事项:

  1. strlen 函数不会检查传入的指针是否为null,所以在使用之前应该确保指针是有效的。
  2. strlen 函数计算的是字符串中字符的个数,不包括末尾的空字符。
  3. 由于 strlen 需要遍历整个字符串来计算长度,所以对于非常长的字符串,它的执行时间可能会相对较长。如果你在处理大量字符串或者对性能有严格要求的情况下,可能需要考虑其他方法来优化字符串长度的计算。
strcpy:

作用:

strcpy 函数的作用是将一个字符串(包括空字符'\0')复制到另一个字符串中,源字符串以空字符'\0'结束,strcpy 会将源字符串的所有字符(直到空字符为止)复制到目标字符串中,并且在目标字符串的末尾添加一个空字符,以表示字符的结束。

解释:

在C语言中,字符串是通过字符数组来表示的。strcpy 函数接受两个参数:一个是指向目标字符串的指针,另一个是指向源字符串的指针。函数将源字符串的内容复制到目标字符串中,覆盖目标字符串的原始内容(如果有的话)。

函数原型:

char *strcpy(char *dest, const char *src);

 1. dest 是一个指向目标字符数组的指针,用于存储复制的字符串。

 2. src 是一个指向源字符数组的指针,既要复制的字符串。 

 3. 函数返回一个指向目标字符串的指针。

示例:

#include <stdio.h>  
#include <string.h>  int main() {  char source[] = "Hello, World!";  char destination[50];  strcpy(destination, source);  printf("The destination string is: %s\n", destination);  return 0;  
}

 输出:

The destination string is: Hello, World!

注意事项:

  1. 使用 strcpy 时必须确保目标字符串有足够的空间来存储源字符串的内容,包括末尾的空字符。如果目标字符串的空间不足以容纳源字符串,就会发生缓冲区溢出,这可能导致程序崩溃或更严重的安全问题。
  2. strcpy 不会检查目标数组的大小,因此在使用它之前,程序员必须确保目标数组足够大。为了避免缓冲区溢出,可以考虑使用 strncpy 函数,它允许你指定一个最大字符数来限制复制的字符数量。
  3. strcpy 不会检查源字符串是否为 NULL,所以在使用之前应该确保源字符串是有效的。
strcat:

作用:

strcat 函数的作用是将一个字符串(源字符串)连接到另一个字符串(目标字符串)的末尾。它会找到目标字符串中的终止空字符('\0'),然后在这个位置后追加源字符串的所有字符(包括其自身的终止空字符)。

解释:

在 C 语言中,字符串是通过字符数组来表示的,并且以空字符('\0')作为结束标志。strcat 函数接受两个参数:第一个参数是目标字符串,第二个参数是要追加的源字符串。函数会将源字符串的内容复制到目标字符串的末尾,并确保新的字符串也以空字符结束。

函数原型:

char *strcat(char *dest, const char *src);

1. dest 是指向目标字符串的指针。

2.  src 是指向源字符串的指针,即要追加到目标字符串末尾的字符串。这里的 const 修饰符表示在函数执行过程中,src 所指向的字符串内容不会被修改。

返回值:

strcat 函数返回指向目标字符串 dest 的指针

示例:

#include <stdio.h>  
#include <string.h>  int main() {  char str1[50] = "Hello";  char str2[] = ", World!";  strcat(str1, str2);  printf("%s\n", str1);  return 0;  
}

输出:

Hello, World!

注意事项:

  1. 使用 strcat 函数之前,必须确保目标字符串 dest 已经分配了足够的空间来容纳源字符串 src 的内容,包括终止的空字符。否则,如果目标字符串的空间不足以容纳追加的内容,就会发生缓冲区溢出,这可能导致程序崩溃或引发更严重的安全问题。
  2. 为了避免缓冲区溢出,你可以使用 strncat 函数,它允许你指定一个最大字符数来限制追加的字符数量。
 strcmp:

作用:

strcmp 函数的主要作用是按照字典顺序比较两个字符串。它会逐个比较两个字符串中的对应字符,直到出现不同的字符或者遇到字符串结束符('\0')为止。

解释:

在 C 语言中,字符串是通过字符数组来表示的,并且以空字符('\0')作为结束标志。strcmp 函数会按照 ASCII 码的顺序,从两个字符串的第一个字符开始比较,如果两个字符相等,则继续比较下一个字符;如果两个字符不相等,则根据它们的 ASCII 码大小返回相应的结果。

比较规则:

  • 如果 str1 和 str2 完全相同(包括长度和内容),则 strcmp 返回 0。
  • 如果 str1 在字典顺序上小于 str2,则 strcmp 返回一个负数。
  • 如果 str1 在字典顺序上大于 str2,则 strcmp 返回一个正数。

函数原型:

int strcmp(const char *str1, const char *str2);

1 .str1 和 str2 是指向要比较的两个字符串的指针。 

2 . 函数返回一个整数,表示两个字符串的比较结果。

示例:

#include <stdio.h>  
#include <string.h>  int main() {  char str1[] = "apple";  char str2[] = "banana";  char str3[] = "apple";  int result1 = strcmp(str1, str2); // 比较 "apple" 和 "banana"  int result2 = strcmp(str1, str3); // 比较 "apple" 和 "apple"  if (result1 < 0) {  printf("str1 is less than str2\n");  } else if (result1 > 0) {  printf("str1 is greater than str2\n");  } else {  printf("str1 is equal to str2\n");  }  if (result2 == 0) {  printf("str1 is equal to str3\n");  } else {  printf("str1 is not equal to str3\n");  }  return 0;  
}

输出:

str1 is less than str2
str1 is equal to str3

注意事项:

  1. 使用 strcmp 时,应确保两个字符串指针都是有效的,且指向的字符串以空字符结束。
  2. strcmp 是区分大小写的,即它会根据字符的 ASCII 码值进行比较,因此大写和小写字母被视为不同的字符。如果需要不区分大小写的比较,可以使用其他方法或自定义比较函数。
字符串案例:
  • 需求:自定义一个函数my_strlen(),实现的功能和strlen一样
  • 示例代码:
#include <stdio.h>// 函数定义
int my_strlen(char * temp) {// 定义一个累加个数的变量,初始值为0int i = 0;// 循环遍历每一个字符,如果是'\0'跳出循环while (temp[i] != '\0') {// 下标累加i++;}return i;
}int main() {char *p = "hello";// 函数调用int n = my_strlen(p);printf("n = %d\n", n);return 0;
}

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

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

相关文章

二刷大数据(二)- Spark

目录 SparkHadoop区别核心组件运行架构Master&WorkerApplication (Driver)Executor RDD概念yarn下工作原理算子依赖血缘关系阶段划分广播变量 shuffle流程SparkSQLDataSet、DataFrame、RDD相互转换 SparkStreaming Spark Spark是一种基于内存的快速、通用、可扩展的大数据…

为什么养猫圈更信赖进口生骨肉冻干?五款大卖榜单品控稳冻干首次分享

新手养猫人常常会有这样的疑问&#xff1a;为何进口生骨肉冻干价格如此昂贵&#xff0c;但仍有大量养猫达人对其推崇备至&#xff1f;与国产生骨肉冻干相比&#xff0c;进口产品的价格高出3-4倍之多&#xff0c;那么这高昂的价格背后&#xff0c;进口生骨肉冻干是否真的值得推荐…

初识--Linux的虚拟地址空间

重新了解地址空间 在学习c/c语言的时候,大家一定见过以下这张图 说的是程序会加载在如图的结构上,实际上,我们真的对他很了解吗,而在Linux进程控制这,就会有一个奇怪的现象 前提提要:简要介绍一下fork函数 进程内核数据结构(PCB)自己的代码以及数据 在Linux中,fork可以从当…

P9241 [蓝桥杯 2023 省 B] 飞机降落

原题链接&#xff1a;[蓝桥杯 2023 省 B] 飞机降落 - 洛谷 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dfs全排列的变形题。 因为最后问飞机是否降落&#xff0c;并且一架飞机降落完毕时另一架飞机才能降落。所以我们设置dfs的两个变量cnt为安全…

计算机科学与导论 第十六章 安全

文章预览&#xff1a; 16.1引言16.1.1 安全目标16.1.2 攻击 16.2机密性16.2.1 对称密钥密码术16.2.2 非对称密钥密码术 16.1引言 为了安全&#xff0c;信息需要避开未授权的使用(机密性),保护信息不受到未授权的篡改(完整性)&#xff0c;并且对于得到授权的实体来说是需要时可…

常用序号、标点符号 相关正则表达式

(?:[\(|&#xff08;|\[])?\d[\]|\)&#xff09;|\、]|[\u2460-\u2473]|[\u4e00-\u5341][.|、]匹配序号 \d\.(?!\d)|\d、常规序号匹配&#xff1a; rule1: 标准格式1. 2、 rule2:排除小数 [^\u4E00-\u9FA5\uFF00-\uFFEFa-zA-Z0-9\s]所有符号 [\u3000-\u303F\uFF00-\uFFE…

分类算法——模型选择与调优(三)

交叉验证 交叉验证&#xff1a;将拿到的训练数据&#xff0c;分为训练和验证集。以下图为例&#xff1a;将数据分成4份&#xff0c;其中 一份作为验证集。然后经过4次&#xff08;组&#xff09;的测试&#xff0c;每次都更换不同的验证集。即得到4组模型的 结果&#xff0c;取…

使用Google reCAPTCHA防止机器注册

本文作者&#xff1a;陈进坚 博客地址&#xff1a;https://jian1098.github.io CSDN博客&#xff1a;https://blog.csdn.net/c_jian 简书&#xff1a;https://www.jianshu.com/u/8ba9ac5706b6 联系方式&#xff1a;jian1098qq.com 环境要求 能翻墙的电脑域名 验证原理 在谷歌…

C++入门之类和对象

C入门之类和对象 文章目录 C入门之类和对象1. 类的6个默认对象2. 构造函数2.1 概念2.2 特性2.3 补丁 3. 析构函数3.1 概念3.2 特性3.3 总结 4. 拷贝构造函数4.1 概念4.2 特性4.3 总结 1. 类的6个默认对象 如果一个类中什么都没有&#xff0c;那么这个类就是一个空类。但是&…

个人网站制作 Part 21 添加多语言支持 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加多语言支持&#x1f528;使用多语言库&#x1f527;步骤 1: 选择多语言库&#x1f527;步骤 2: 安装vue-i18n&#x1f527;步骤 3: 创建多语言文件 &#x1f528;使用…

【网站项目】 游泳馆管理系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

教育短信群发有效果吗?邦之信短信平台为您分析!

教育短信群发确实是一种有效的营销和沟通手段&#xff0c;尤其在教育行业&#xff0c;其效果得到了广泛的认可。以下是教育短信群发的主要效果及其原因分析&#xff1a; 首先&#xff0c;短信群发能够覆盖广大的手机用户群体&#xff0c;几乎每个人都有手机&#xff0c;且经常…

uni-app学习

目录 一、安装HBuilderX 二、创第一个uni-app 三、项目目录和文件作用 四、全局配置文件&#xff08;pages.json&#xff09; 4.1 globalStyle&#xff08;全局样式&#xff09; 导航栏&#xff1a;背景颜色、标题颜色、标题文本 导航栏&#xff1a;开启下拉刷新、下拉背…

电商价格监测合规性探讨

品牌在做控价、数据分析的过程中&#xff0c;都需要先有数据作为支撑&#xff0c;也就是说要先采集数据&#xff0c;价格监测也是如此&#xff0c;监测的基础是采集&#xff0c;现在主流的采集形式是爬虫采集&#xff0c;可以理解为人工采集的升级版&#xff0c;以机器代替人工…

QT常量中有换行符解决方法--使用中文显示乱码或者编译报错

QT6.3常量中有换行符 int ret2QMessageBox::information(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit(("确认启动设备吗?")),QMessageBox::Yes,QMessageBox::No); 确保显示正常&#xff0c;建议每次使用时&#xff0c;中文的前后加一个空…

PLSQL中文乱码问题 + EZDML导入数据库模型乱码

PLSQL中文乱码问题 EZDML导入数据库模型乱码 查询数据库字符集 select userenv(language) from dual;查询本地字符集编码 select * from V$NLS_PARAMETERS;理论上 数据库字符集 跟 本地字符集编码 是一致的 本地字符集编码需要拼接字段值 NLS_LANGUAGE NLS_TERRITORY NLS…

【机器学习300问】71、神经网络中前向传播和反向传播是什么?

我之前写了一篇有关计算图如何帮助人们理解反向传播的文章&#xff0c;那为什么我还要写这篇文章呢&#xff1f;是因为我又学习了一个新的方法来可视化前向传播和反向传播&#xff0c;我想把两种方法总结在一起&#xff0c;方便我自己后续的复习。对了顺便附上往期文章的链接方…

Java工程师常见面试题:Java基础(一)

1、JDK 和 JRE 有什么区别&#xff1f; JDK是Java开发工具包&#xff0c;它包含了JRE和开发工具&#xff08;如javac编译器和java程序运行工具等&#xff09;&#xff0c;主要用于Java程序的开发。而JRE是Java运行环境&#xff0c;它只包含了运行Java程序所必须的环境&#xf…

MySQL与Redis缓存一致性的实现与挑战

缓存是提高应用性能的重要手段之一&#xff0c;而 MySQL 和 Redis 是两种常用的数据存储和缓存技术。在许多应用中&#xff0c;常常将 Redis 用作缓存层&#xff0c;以加速对数据的访问。然而&#xff0c;在使用 MySQL 和 Redis 组合时&#xff0c;保持缓存与数据库之间的一致性…

淘宝京东1688API接口系列:商品属性丨价格丨sku丨详情图等,请求文档说明示例

电商平台的API接口系列为商家、开发者及数据分析师等提供了丰富的商品数据&#xff0c;帮助他们更深入地了解商品详情、市场动态以及消费者行为。以下是淘宝、京东等电商平台API接口系列中关于商品属性、价格、SKU和详情图等相关信息的介绍&#xff1a; 1.请求方式&#xff1a…