C语言 第四章 数组(3)

news/2025/3/14 8:57:45/

目录

一维数组

 内存分析

  数组内存图

注意事项

错误举例1: 

错误举例2:

  变长数组

 char型数组与字符串

 char型数组

 字符串的使用

字符串声明方式1:标准写法

字符串声明方式2:简化写法

实例

字符串的长度

 gets()与puts()的使用

gets():

举例:字符串的读写

puts():


一维数组


 内存分析


  数组内存图
 

针对代码 int a[5] = {1,2,3,4,5}; 

注:数组名记录数组首地址(即a[0]的地址),元素连续分布。

假设a[0]地址是0x1122 ,则 a[1]地址= a[0]的地址+int字节数(4)= 0x1122 + 4 = 0x1126,

                                             a[2]地址= a[1]地址 + int字节数(4)= 0x1126 + 4 = 0x112A,

                                              依次类推。
 

注意事项



 C语言规定,数组变量一旦声明,数组名指向的地址不可更改。声明数组时,编译器自动分配内存地址并与数组名绑定。用大括号重新赋值不允许,如:
 


错误举例1: 

int nums[5];nums = {22, 37, 3490, 18, 95}; //(使用大括号赋值,必须在数组声明时赋值,否则编译报错)

错误举例2:

 int nums[5] = {1, 2, 3, 4, 5};nums = {6, 7, 8, 9, 10}; //(报错,更改数组地址)

  变长数组


数组声明时,除用常量指定长度,也可用变量或表达式指定,即变长数组

 int n = 10;int arr[n]; 。//其特征是数组长度运行时确定,好处是无需开发时预估长度,可在运行时精准分配。int i = 10; int a1[i]; 

 注:变长数组在C99标准引入,C11标准标记为可选特性,部分编译器可能不支持或有限制。
 

 char型数组与字符串


 char型数组


字符型数组,即数组元素数据类型为字符型的数组。一方面,可看作普通数组,初始化及常用操作同前。

例如:

 char arr[] = {'a','b','c','d'}; 。

另一方面,字符型数组可用于存储字符串。
 

 字符串的使用


  • "helloworld"
  • "abc"

  • "a"

  • "123" 

由双引号引起来的一串字符称为字符串字面值,简称字符串(String)。

  • 通常把""称为空串,即不包含任意字符的字符串;
  • 而" "则称为空格串,是包含一个空格字符的字符串,二者不能等同。

C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。

在字符串结尾,C语言自动添加一个'\0'的转义字符作为字符串结束的标志,所以字符数组也必须以'\0'字符结束。


字符串声明方式1:标准写法

//显式以'\0'为最后一个字符元素结束char str[12] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};

:字符串写成数组的形式,是非常麻烦的,C语言提供了一种简化写法。双引号之中的字符,会被自动视为字符数组。


字符串声明方式2:简化写法

//自动在末尾添加'\0'字符char str1[12] = {"hello world"};   //注意使用双引号,非单引号
//或者char str2[12] = "hello world";   //可以省略一对{}来初始化数组元素

由于字符数组的长度可以让编译器自动计算,所以声明时可以省略字符数组的长度:

 char str1[] = {"hello world"}; 
//或者char str2[] = "hello world"; 

注: 双引号里面的字符串,不用自己添加结尾字符\0,C语言会自动添加。所以,代码中数组str1或注str2的元素依次为 'h','e','l','l','o',' ','w','o','r','l','d','\0'。

对应的存储为每个存储单元大小为1个字节,示例图(包含字符和空格、空字符的存储示意)
其中,数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。所以,上述两个数组的长度不是11,而是12

实例

 #include "stdio.h"int main() {//字符数组char arr[] = {[0]: 'a', [1]: 'b', [2]: 'c', [3]: 'd'};//字符串//C语言中 创建字符串方式1 标准写法//显式以'\0'为最后一个字符元素结束char str[12] = {[0]: 'h', [1]: 'e', [2]: 'l', [3]: 'l', [4]: 'o', [5]: ' ', [6]: 'w', [7]: 'o', [8]: 'r', [9]: 'l', [10]: 'd', [11]: '\0'};char name[5] = {[0]: 'j', [1]: 'i', [2]: 'm', [3]: '\0'};//声明字符串方式2char str1[12] = {"hello world"};char str2[12] = "hello world";char str3[] = {"hello world"};char str4[] = "hello world";char name 

字符串的长度


eg.

char nation[10]={"China"}; 
注:数组nation的前5个元素为:'C','h','i','n','a',第6个元素为'\0',后4个元素也自动设定为'\0'。

char[3]={"jim"};//字符串数组长度
printf("%d\n", sizeof(name)/ sizeof(char));

注意:在计算字符串长度的时候,'\0' 是结束标志,不算作字符串内容。
另一种计算长度方式(调用strlen()函数)

#include <stdio.h>
#include <string.h>  //需要加载此头文件int main() {char nation[10] = "china";printf("%d\n", strlen(nation));   //5
}

 gets()与puts()的使用


gets():

读取标准输入设备输入的字符串,直到遇到【Enter】键才结束。

char str[20];  //定义一个数组
gets(str);      //获取输入的字符串,存放到字符数组中

举例:字符串的读写
 

c   
int main() {char name[15];printf("enter your name:");gets(name);       //输入字符串至数组变量nameputs(name);       //输出字符串return 0;
}

puts():

在C语言中,puts() 是一个用于输出字符串的标准库函数,其原型定义在 <stdio.h> 头文件中。puts() 函数的作用是将一个字符串打印到标准输出控制台上。

int main() {char str1[] = "helloworld";//定义字符串puts(str1);//输出字符串return 0;
}

注:puts()函数只能用于输出字符串,而不能输出其他类型的数据。如果需要输出其他类型的数据,应使用printf() 函数。


http://www.ppmy.cn/news/1579000.html

相关文章

数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)

1. 算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 在计算机程序设计中&#xff0c;衡量算法优劣的核心标准是效率。但效率不仅指运行速度&#xff0c;还需要综合以下因素&#xff1a; 时间因素&#xff1a;算法执行所需时间 空间因素&#xff1a;算法运行占用的内存空间…

我与DeepSeek读《大型网站技术架构》(13)- 大型网站典型故障案例分析

文章目录 第13章 大型网站典型故障案例分析日志管理缺陷引发的故障高并发数据库访问问题锁机制滥用导致服务超时缓存运维不当引发的全站瘫痪流程不规范导致的线上事故编程习惯问题引发功能异常生产环境滥用问题其他典型问题总结 第13章 大型网站典型故障案例分析 本章通过九个…

java虚拟机(JVM)以及各种参数详解

Java 虚拟机&#xff08;JVM&#xff09;提供了许多参数来调整其行为和性能&#xff0c;以便更好地适应不同的应用场景。理解和使用这些参数对于优化 Java 应用程序的性能非常重要。以下是一些常用的 JVM 参数及其详细说明&#xff1a; 1. 内存管理参数 -Xms<size>&…

使用工厂加策略模式实现操作日志记录

需求&#xff1a;1.培训班管理&#xff1b;2.报名列表管理&#xff1b;3.申请信息变更&#xff1b;4.申请发布&#xff1b;5.申请审批 以上是本次需求中的5个功能菜单&#xff0c;根据客户需求&#xff0c; 要求在上述功能操作中的每一步都要进行日志的记录&#xff0c;分别记录…

【机械视觉】C#+VisionPro联合编程———【四、检测彩色保险丝实例,以及C#+VisionPro的两种写法】

【机械视觉】C#VisionPro联合编程———【四、检测彩色保险丝实例&#xff0c;以及C#VisionPro的两种写法】 在机械视觉C#VisionPro联合编程编程中&#xff0c;在处理业务逻辑时通常会有两种写法&#xff0c;一种是将逻辑代码编写在visionPro中然后再使用C#将visionPro工具加载…

Ollama有安全漏洞! 国家网络安全通报中心紧急通报

最新消息&#xff01;国家网络安全通报中心昨夜发布紧急通告&#xff1a;全球超火的AI神器Ollama惊现重大漏洞&#xff01;正在用DeepSeek、Llama的你&#xff0c;赶紧自查&#xff01; &#x1f6d1; 你正美滋滋用Ollama跑着大模型&#xff0c;殊不知黑客正像逛超市一样随意进…

C++ std::list超详细指南:基础实践(手搓list)

目录 一.核心特性 1.双向循环链表结构 2.头文件&#xff1a;#include 3.时间复杂度 4.内存特性 二.构造函数 三.list iterator的使用 1.学习list iterator之前我们要知道iterator的区分 ​编辑 2.begin()end() 3. rbegin()rend() 四.list关键接口 1.empty() 2. size…

【微知】tmux如何在某个会话session中创建多个窗口?如何切换?(Ctrl+b + c创建;Ctrl+b + 数字 切换;Ctrl+b + 关闭)

创建窗口 创建新窗口&#xff1a;Ctrlb c 切换窗口&#xff1a; 切换到下一个窗口&#xff1a;Ctrlb n 切换到上一个窗口&#xff1a;Ctrlb p 切换到指定窗口&#xff1a;Ctrlb 数字&#xff08;窗口编号&#xff09; 重命名窗口&#xff1a;Ctrlb ,&#xff08;逗号&a…