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,并且不能读取空格。如果输入空格,会认为是结束

最新文章

  1. Enterprise Architect 学习 之 用例图
  2. 导入 RecyclerView 控件 的过程(Android 6.0)
  3. noip2016代码
  4. OceanBase架构浅析(一)
  5. .NET 使用CouchBase 基础篇
  6. 接入WebSocket
  7. 修复南尼U盘
  8. 2_Cat Years
  9. Python 常见的内置模块
  10. VMware Workstation 12 Pro 之安装林耐斯-LinuxMint-系统
  11. 百度地图JavaScript API经纬度查询-MAP
  12. Linux日志管理高级进阶:实例详解syslog
  13. 四、Mysql主从同步
  14. java excel Workbook API
  15. 尝试新的构造系统 Ninja
  16. 【docker】资料
  17. Delphi中静态方法重载还是覆盖的讨论
  18. JS关闭窗口或JS关闭页面的几种代码!
  19. OpenJ_Bailian - 4152 最佳加法表达式 dp
  20. spring AOP的两种代理

热门文章

  1. iOS开发:十六进制颜色转UIColor
  2. MySQL笔记(4)-- 索引优化
  3. python对齐输出
  4. python编写“求最大值”
  5. spring官方demo及配置查看
  6. 微信开发+百度AI学习:环境搭建
  7. SparkSQL---UDAF
  8. 如何让Docker镜像飞起来
  9. 【opencv系列04】OpenCV4.X图形绘制
  10. 使用 xposed 突破饿了么 ssl pining