C语言——二维数组和字符数组

二维数组

二维数组本质上是一个行列式的组合,也就是二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。

定义形式:

类型(说明符)  数组名[行数(常量表达式1)][列数(常量表达式2)];

eg:

int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}}

int arr[][] = {{1,2,3},{4,5,6},{7,8,9}}

int arr[3][] = {{1,2},{4,5,6},{7}}//等价于int arr[3][3]

说明:

在C语言中,二维数组在计算机中的存储顺序是按行进行的。

二维数组元素

表示形式:

数组名[下标1][下标2];

eg:  

a[2][3],b[4][9];

 

下标可以是整型表达式,如:a[2-1][2*2-1]

下标可以是已经有值的变量或数组元素, 如:a[2*x-1][b[3][1]]

数组元素可以出现在表达式中, 如:b[1][2]=a[2][3]/2

注意:

使用时数组元素的下标应在已定义数组的大小范围内;      

应注意区别定义数组大小和引用数组元素的区别。

二维数组初始化

方法:

⑴ 分行给二维数组赋初值。如:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

⑵ 可将所有数据写在一个花括号内,按排列顺序对个元素赋值。如:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

⑶ 可对部分元素赋初值,其余自动取0值(\0|0.0)。如:

int a[3][4]={{1},{5,6},{9}};

⑷ 若对全部元素赋初值,则定义数组时可不说明第一维的长度(对方括号不能省),第二维的长度必须指明。如:

int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};

⑸ 在分行赋初值时,也可以省略第一维的长度说明。如:

int a[ ][4]={{1,2,3},{0},{0,10}};

eg:

二维数组的遍历

#include <stdio.h>

int main()

{

        int arr[][3] = {{1},{2,4},{5,6,7}};// 经过论证:二维数组我们必须指明第2维的数组的长度

        // 获取行元素的大小

        int length = sizeof(arr) / sizeof(arr[0]); // 如果是二维数组,第1维的长度,应该是如左侧这样获取

        printf("length:%d\n",length);

        

        // 遍历二维数组,需要使用双层for循环,外层遍历内层遍历每一行的

        for(int row = 0;row length;row++)

        {

        // 获取列元素的总大小

        int len = sizeof(arr[row]) / sizeof(int);

        for(int col = 0; col len; col++)

        {

        // 获取列元素

        printf("%3d",arr[row][col]);// 意思是获取数组arr 第row行第col列

        }

        printf("\n");

        }

        return 0;

        }// 数据类型,分支结构,循环结构,数组

二维数组:矩阵转置

/**

* 需求:二维数组案例-矩阵的转置(就是将一个2行3列的数组转换为3行2列的数组)

*/

#include

int main()

        {

        // 准备2个数组,存放转前和转后的数据

        int arr_before[2][3] = {1,2,3,4,5,6};

        int arr_after[3][2] = {0};// 初始化,每一列上都是0

        

        // 遍历arr_before

        for(int i = 0;i sizeof(arr_before)/sizeof(arr_before[0]);i++)

        {

        for(int j = 0;j sizeof(arr_before[i])/sizeof(int);j++)

        

        // 转置

        arr_after[j][i] = arr_before[i][j];

        }

        }

        // 遍历arr_after

        for(int i = 0;i sizeof(arr_after)/sizeof(arr_after[0]);i++)

        {

        for(int j = 0;j sizeof(arr_after[i])/sizeof(int);j++)

        {

        // 输出

        printf("%4d",arr_after[i][j]);

        }

        printf("\n");

        }

        return 0;

        }

字符数组

概念:

元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。需要注意的一点是,我们

C语言中的字符是字节字符。

字节字符:也就是一个字符占1个字节

语法:

char 数组名[容量]

char 数组名[行容量][列容量]

测试:

char a = 'A'

char b = '1'

char c = 65

char d = "A"  //错误,因为这是字符串写法,也是char数组的写法,char d[1] = "A"

char e = “马”  //错误,中文一个字符超过一个字节

eg:

#include <stdio.h>

int main()
{
        char arr[7][7] = {{' ',' ',' ','*',' ',' ',' '},
                          {' ',' ','*',' ','*',' ',' '},
                          {' ','*',' ',' ',' ','*',' '},
                          {'*',' ',' ',' ',' ',' ','*'},
                          {' ','*',' ',' ',' ','*',' '},
                          {' ',' ','*',' ','*',' ',' '},
                          {' ',' ',' ','*',' ',' ',' '}
                         };

        for(int i = 0;i < sizeof(arr)/sizeof(arr[0]);i++)
        {
                for(int j =0;j < sizeof(arr[i])/sizeof(char);j++)
                {
                        printf("%c",arr[i][j]);
                }
                printf("\n");
        }

        return 0;
}

字符串和字符串结束标志

说明:

C语言规定,字符串以字符'\0'作为结束标志

编译系统对字符串常量自动加一个'\0'作为结束标志。

程序中往往通过判断'\0'来检测字符串是否结束。

'\0'的ASCII码为0,不是一个可显示的字符,是“空操作符”,什么都不做,不会增加有效字符,仅是一个供判别的标志。

字符数组的多样表示

char数组可以以数组的方式一个个输出每个字符;我们的char数组也可以以字符串的方式整体进行输出所有字符

具体如下面案例:

/*

需求:字符数组->字符串

*/

#include

int main()

{

// 字符串第1种表示:

char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d'};

// 字符串第2种表示:

char s2[] = {"hello world"};

// 字符串第3种表示:

char s3[] = "hello world";

// 测试,使用字符串方式打印,这样就不用一一遍历

printf("%s\n",s1);        //hello world

printf("%s\n",s2);        //hello world

printf("%s\n",s3);        //hello world

return 0;

}

注意:

字符串的长度与字符数组的长度不一定相同。

利用字符串常量可以对字符数组进行初始化,但不能用字符串常量为字符数组赋值。

// 正确写法:利用字符串常量给字符数组初始化

char b[15] = "China";

// 错误写法:利用字符串常量给字符数组赋值

char b[15];

b[15] = "China";

字符串输入

格式:

scanf("%s",数组名)

注意:

采用scanf进行字符串输入,要求字符串中不能存在空格,否则字符串遇到空格会结束。

fgets(数组名,数组容量,stdin);

说明:采用fgets进行字符串输入,可获取所有输入的字符串,包含\n,在实际的字符串处理时,我们可能需要处理\n

注意:

1. 如果输入的字符串不包含空格和换行,可以使用scanf() | fgets();

2. 如果输入的字符串需要包含空格和换行,只能使用fgets();

3. 经过对比,我们发现,在字符串的输入中,fgets()更好;

字符串输出

puts(数组名)

printf("%s",数组名);

字符串拼接

strcat(数组名,"需要拼接的字符串")

注意:需要引入#include  <string.h>

字符串拷贝

strcpy(数组名,字符串)

注意:需要引入<string.h>

说明:这个方法适合给字符串赋值用。

字符串比较

strcmp(字符串1,字符串2);

注意:

1. 需要引入<string.h>

2. 返回的结果是boolean

获取字符串长度

strlen(字符串)

注意:

1. 需要<string.h>

2. 返回字符串长度

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值