010-字符串-C语言笔记
010-字符串-C语言笔记
学习目标
1.【掌握】二维数组的声明和初始化
2.【掌握】遍历二维数组
3.【掌握】二维数组在内存中的存储
4.【掌握】二维数组与函数
5.【掌握】字符串
一、二维数组的声明和初始化
二维数组也是数组,他具有数组的所有特性。在学习二维数组过程中我们完全可以把一维数组想象成一个“行结构”,把二维数组想象成是一个有行有列的“表格结构”,用每一个单元格来存储数据。
声明语法:元素类型 数组名[行数][列数];
术语:
元素:每一个单元格就是二维数组的元素,用来存储数据
下标:每个元素的下标由两个下标组成,一个行下标,一个列下标
长度:这个二维数组可以存储的数据的个数,也就是单元格的个数。
|
1
2
3
|
intarr[3][4]; //正确,三行四列的二维数组
intarr1[5][2]; //正确,五行二列的二维数组
intarr2[][]; //错误,需要指定行、列
|
注意:
1.必须要指定二维数组的行数和列数。
2.声明二维数组的时候,行数、列数可以使用常量、变量、表达式、宏。
3.行数、列数可以是1,可以是0,但不是负数和小数。
4.二维数组没有为数组元素赋值,那么这些元素默认值是垃圾值。
赋值:数组名[行下标][列下标] = 数据;
根据下标为二维数组赋值,最大行下标是行数 - 1,最大列下标是列数 - 1。
取值:数组名[行下标][列下标];
取值和赋值一样,也是根据二维数组的下标来取值,最大行下标是行数 - 1,最大列下标是列数 - 1。
|
1
2
3
4
5
6
7
8
9
|
intarr[3][4];//声明一个3行、4列的二维数组
//为二维数组中每个元素赋值
arr[0][0]=1;
arr[0][1]=2;
arr[0][2]=3;
//......
arr[2][3]=10;
intnum=arr[0][2];//取值并赋值给一个同类型的变量
|
初始化:
声明二维数组的同时为二维数组的每个元素赋值,初始化二维数组的时候,行数可以省略,但列数无路如何都不能省略。初始化二维数组,支持全部初始化、部分初始化、指定初始化。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//全部初始化
intarr[3][4]={{1,2,3,1},{4,5,6,2},{7,8,9,3}};//声明一个二维数组并初始化每个元素
intarr1[][4]={{1,2,3,5},{4,5,6,2},{7,8,9,5}};//初始化可以省略行数,系统会根据后面大括号来计算出行数
intarr2[2][5]={1,2,3,4,5,6,7,8,9,0};//不需要大括号计算行,会根据行数和列数自动为每个元素赋值
intarr3[][5]={1,2,3,4,5,6,7,8,9,0};//省略行,但不能省略列.自动从第一个元素依次为每个元素赋值
//部分初始化
intarr4[3][4]={{1},{2},{3}};//为行第一个元素赋值,并初始化其他元素为0
intarr5[3][4]={1,2,3,4};//按照顺序为每一个元素赋值,并初始化其他元素为0 00 01 02 03 10 11这样的顺序
intarr5[][4]={1,2,3,4};//可以省略行,自动根据列算出行,按照顺序为每一个元素赋值,并初始化其他元素为0
//指定初始化
intarr6[3][4]={[1]={10,20,30,40},[2]={10,40,21,55}};//为行下标1和2的的元素赋值,其他元素初始化0
|
二、遍历二维数组
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
intmain(){
//声明一个二维数组并初始化
intarr[3][4]={12,33,55,22,6,4,8,64,99,33};
//外层控制行
for(inti=0;i<3;i++){
//内层控制列
for(intj=0;j<4;j++){
printf("arr[%d][%d] = %d\n",i,j,arr[i][j]);
}
}
return0;
}
|
三、二维数组在内存中的存储

本质:
二维数组的本质其实是一个一维数组,每一行就是这个一维数组的元素,也就是每一行都是一个一维数组,也就是一维数组的元素也是一个一维数组。比如:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
//其实这是一个一维数组,一维数组的长度为3,并且每一个元素是一个长度为4的一维数组数组。
intarr[3][4]={
{10,20,30,40},
{50,60,70,80},
{90,100,110,120}
};
//遍历一维数组第一个元素的数组里的元素,也就是遍历了二维数组的第1行的元素
for(inti=0;i<4;i++){
printf("arr[0][%d] = %d\n",i,arr[0][i]);
}
printf("arr[0] = %p\n",arr[0]);//arr[0] 就是第一个一维数组名
|
内存分配:在分配字节空间的时候,从高地址向低地址分配一块连续的空间,空间的大小为(每个元素占用的空间 * 元素个数)也就是(sizeof(数组的数据类型) * 行 * 列)。
|
1
2
3
4
5
|
长度=sizeof(二维数组名)/sizeof(数据类型);
行数=sizeof(二维数组名)/sizeof(二维数组名[0]);
列数=sizeof(二维数组名[0])/sizeof(数据类型);
|
四、二维数组与函数
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <stdio.h>
//如果函数的参数是一个一维数组,那么在调用函数的时候,可以传入一个二维数组的行,因为二维数组的行本质就是一个一维数组。
voidprintfArray(intarr[],intlength){
for(inti=0;i<length;i++){
printf("arr[0][%d] = %d\n",i,arr[i]);
}
}
//当二维数组作为函数的参数,那么在调用函数的时候,需要先传入二维数组的行和列,然后在传入二维数组名,参数的二维数组必须要指定列。
voidtest(introws,intcols,intarr[][cols]){
for(inti=0;i<rows;i++){
for(intj=0;j<cols;j++){
printf("arr[%d][%d] = %d\n",i,j,arr[i][j]);
}
}
}
intmain(){
//随便整一个二维数组
intarr[4][10]={76,45,3,98,65,3,77,43,24,90,87,64};
//计算二维数组的行、列
introws=sizeof(arr)/sizeof(arr[0]);
intcols=sizeof(arr[0])/sizeof(int);
//arr[0]就是一维数组名
printfArray(arr[0],rows);
//arr是二维数组名
test(rows,cols,arr);
return0;
}
|
五、字符串
字符数组的声明
|
1
|
charchs[5];
|
初始化
|
1
|
charchs[5]={'a','b','c','d'};//末尾自动补'\0'
|
遍历字符数组
|
1
2
3
4
|
intlength=sizeof(chs);
for(inti=0;i<length;i++){
printf("%c",chs[i]);
}
|
字符数组的默认值
1.如果声明一个字符数组,如果不为字符数组初始化,那默认也是垃圾值。
2.如果声明一个字符数组同时,我们初始化了部分元素的值,其他元素的值初始化为'\0'。
3.'\0'代表一个不可见的值,打印出来声明都没有。
字符数组存储字符串
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//声明5个长度的字符数组,并储存字符
charnames[5]={'a','b','c','d','\0'};
//声明5个长度的字符数组,只赋值部分元素,其余元素会自动初始化为'\0'
charnames0[5]={'a','b','c','d'};
//声明的时候初始化可以省略长度,会自动计算出来的
charnames1[]={'a','b','c','d','\0'};
//可以简写,并自动追加'\0'存储到字符数组
charnames2[]={"abcd"};
//将字符串中的每一个字符依次存储到数组之中,并自动追加'\0'
charnames3[]="abcd";
//不指定数组长度,那么这个数组的长度就是字符串数据的字符个数+1
charnames4[]="abcd";
//如果指定了字符数组的长度,那么数组的长度就是指定长度,存储的字符不能超过长度-1
charnames5[20]="abcd";
//如果在初始化一个字符数组的时候,可以给中文。仅限在声明的时候初始化给中文。
charnames6[]="大狗";
|
输出字符串
|
1
2
|
charstr[]="jack";
printf("%s",str);//使用%s格式控制符输出字符串,从给定字符数组地址开始,一个一个字符输出,直到遇到'\0'就结束。
|
输入字符串
|
1
2
|
charstr[20];
scanf("%s",str);//输入的字符不能超过给定的字符数组长度-1,并且不能读取空格。如果输入空格,会认为是结束
|
010-字符串-C语言笔记的更多相关文章
- R语言笔记
R语言笔记 学习R语言对我来说有好几个地方需要注意的,我觉得这样的经验也适用于学习其他的新的语言. 语言的目标 我理解语言的目标就是这个语言是用来做什么的,为什么样的任务服务的,也就是设计这个语言的动 ...
- R语言笔记4--可视化
接R语言笔记3--实例1 R语言中的可视化函数分为两大类,探索性可视化(陌生数据集,不了解,需要探索里面的信息:偏重于快速,方便的工具)和解释性可视化(完全了解数据集,里面的故事需要讲解别人:偏重全面 ...
- Scala语言笔记 - 第一篇
目录 Scala语言笔记 - 第一篇 1 基本类型和循环的使用 2 String相关 3 模式匹配相关 4 class相关 5 函数调用相关 Scala语言笔记 - 第一篇 最近研究了下scala ...
- Go 语言笔记
Go 语言笔记 基本概念 综述 Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡. 设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 ch ...
- 014-预处理指令-C语言笔记
014-预处理指令-C语言笔记 学习目标 1.[掌握]枚举 2.[掌握]typedef关键字 3.[理解]预处理指令 4.[掌握]#define宏定义 5.[掌握]条件编译 6.[掌握]static与 ...
- 013-结构体-C语言笔记
013-结构体-C语言笔记 学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7 ...
- 011-指针(上)-C语言笔记
011-指针(上)-C语言笔记 学习目标 1.[掌握]字符串常用函数 2.[掌握]指针变量的声明 3.[掌握]指针变量的初始化 4.[掌握]函数与指针 5.[掌握]指针的数据类型 6.[掌握]多级指针 ...
- 003-scanf函数使用和表达式-C语言笔记
003-scanf函数使用和表达式-C语言笔记 学习目标 1.[掌握]输入函数scanf的基本使用方法 2.[掌握]输入函数scanf运行原理和缓冲区理解 3.[掌握]算术运算符和算术表达式的使用 4 ...
- 002-IDE的使用与数据类型-C语言笔记
002-IDE的使用与数据类型-C语言笔记 学习目标 1.[了解]IDE并熟悉Xcode基本使用技巧 2.[理解]C程序的入口和运行流程 3.[理解]变量的声明赋值和一些细节 4.[理解]变量的命名规 ...
随机推荐
- 理解Raft协议
目录 1.Paxos算法存在的问题 2.Raft算法 2.1 复制状态机 2.2. Raft算法 2.2.1 安全性问题 2.2.2 Leader选举 2.2. ...
- VS code调试代码快速上手必备知识
一.通过简单的配置运行一个JavaScript程序 1.打开(创建)一个新的工作空间(文件夹),并创建一个js文件: var name='world'; var s='Hello,${name}!'; ...
- sql学习~pivot和unpivot用法
pivot 可以把列值转换为输出中的多个列. pivot 可以在其他剩余的列的值上执行聚合函数. unpivot 将列转换为列值 语法 SELECT <non-pivoted column&g ...
- [leetcode] 位操作题解-2
本文是 leetcode 位操作题库的题目解析.点击每个标题可进入题目页面. 重复的DNA序列 题目:所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:"ACGAATT ...
- [算法总结] 动态规划 (Dynamic Programming)
本文组织结构如下: 前言 最长公共子序列(LCS) 最长不下降子序列(LIS) 最大连续子序列之和 最长回文子串 数塔问题 背包问题(Knapsack-Problem) 矩阵链相乘 总结 前言 在学过 ...
- 最新SCI影响因子发布!Nature屠榜,AI领域Top 1000期刊盘点
[导读]2018年度SCI期刊影响因子最新发布,Nature.Science.Cell三大神刊排名前列.新智元摘取其中有关人工智能.机器学习.计算机视觉.机器人学等领域的期刊并做简要介绍,希望对读者选 ...
- Python python对象 enumerate
""" enumerate(iterable[, start]) -> iterator for index, value of iterable Return a ...
- iOS mmap
一.常规文件操作 常规文件操作(read/write)有那几个重要步骤: 进程发起读文件请求 内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的 inode inode 在 ...
- Mongodb中 数据库和集合的创建与删除
1.查询数据库,查询表: show dbs //查询所有的数据库show collections //查询所有的集合(表) 2.创建数据库或切换到数据库(存在就切换,不存在就创建) use spide ...
- -bash: syntax error near unexpected token `newline'问题解决
原因:bash语法错误,例如, 仔细查看发现语句中不能有'<'和'>',删除这两个符号即可: 问题解决!