数组,字符串

思维导图链接boardmix

数组,字符串_第1张图片

1. 数组

【1】数组的概念

数组:一种 内存连续 ,且存储一组 数据类型相同 的数据结构。

数组,字符串_第2张图片

【2】数组的定义

数据类型 变量名[数组容量];
int arr1[3];         //申请了一个数组,数组中的每一个元素都是int类型,共3个int类型变量,数组占:3*4bytes = 12bytes;
char arr2[8];        //申请了一个数组,数组中的每一个元素都是char类型,共8个char类型变量,数组占:8*1bytes = 8bytes;

注意:

  1. 数组容量只能是整型常量
  2. ps:在标准的C中可以是整型变量,但是不建议使用。因为在很多编译器上不兼容该规则。

【3】数组内存大小计算

sizeof(数组名);         计算一个数组的大小

【4】数组的初始化

    //初始化格式
    int arr2[3] = {1,2,3};      //全部初始化
    int arr3[3] = {1,2};        //部分初始化,初始化前面部分,后面默认初始化为0
    int arr4[3] = {0};          //初始化前面部分,后面默认初始化为0,即全部为0 
    int arr5[] = {1,2,3,4,5};   //容量不定义,数组容量跟着数据个数决定:5
    
    //int arr6[];               //错误的,因为编译器不知道要申请多少个字节       
    //int arr5[3] = { , 2, 3};  //错误的,前面部分不能省略

数组,字符串_第3张图片

【5】数组的访问

  1. 通过下标的方式访问,下标从0开始编号。例如int arr[3],则下标编号为0,1,2
int arr2[3] = {1,2,3};
arr2[0] --->下标为0的元素的空间---> 存储的是数据1;
arr2[1] --->下标为1的元素的空间---> 存储的是数据2;
arr2[2] --->下标为2的元素的空间---> 存储的是数据3;

【6】数组的访问及遍历

  for(i=0; i<5; i++)
    {
        scanf("%d", &arr[i]);   //从终端获取数据
    }
                                                                                 
    for(i=0; i<5; i++)          //遍历数组:通过循环的方式访问数组中的每一个元素
    {
        printf("%d\n", arr[i]);
    }   

【7】段错误 (核心已转储)

  1. 数组越界,当越界的空间我们没有权限去访问的时候,就会出现段错误
  2. ... ...

数组,字符串_第4张图片

2. 字符串

字符串常量:用双引号括出来的一个或多个字符。"12345"

%s

【1】字符串的概念

  1. 概念: 以 '\0'字符结尾 的 字符数组 就是字符串。 ('\0'字符对应的整型形式就是数字0)
char str1[5] = {'h', 'e', 'l', 'l', 'o'};     --->普通字符数组
char str2[9] = {'h', 'e', 'l', 'l', 'o'};     --->字符串,因为'o'字符后面后'\0'
"hello" ---> 'h' 'e' 'l' 'l' 'o' '\0'

字符数组 和 字符串有什么区别?

  1. 字符串是存储在字符数组中的
  2. 字符串必须以'\0'结尾,字符数组不需要。

【2】字符串初始化

初始化:定义变量的同时赋值

C语言中没有专门用于存储字符串的数据类型,我们将其存储在字符数组中,且以'\0'字符结尾。

char arr1[10] = {'h', 'e', 'l', 'l', 'o'};  //初始化前面部分,后面默认初始化为0
char arr2[10] = "hello";    //用hello字符串给arr2赋值, 给arr2赋了6个值,后面默认初始化为0
char arr3[10] = "";         //""中即使什么都不写,也肯定会有一个'\0'存在,后面默认初始化为0,
                            //所以会将整个数组初始化为0

char arr4[] = "hello";     //缺省容量,跟着后面数组来定,容量是6,后面有个'\0'
char arr5[] = "";          //""中即使什么都不写,也肯定会有一个'\0'存在, 所以容量是1      

【3】字符数组的大小计算

sizeof(数组名);         计算一个数组的大小
char str[32] = "hello";
sizeof(str); ====> 32bytes   共32个char类型元素

【4】字符串的输入输出函数

1)printf

char str[32] = "hello";
printf("%s", str);   ---》打印字符串只需要填字符数组名字即可
%s: 从字符串的首元素开始打印,直到遇到'\0'字符停止。

2)scanf

int a;
scanf("%d", &a);

char str[32];
scanf("%s", str);     //注意,不需要加&符号;

注意:

  1. scanf后面跟的字符串的数组名,不需要加&
  2. %s一次只能识别到 空格,tab, 换行之前,且不会获取空格,tab, 换行

3)puts

char str[32] = "hello world";
printf("%s\n", str);
puts(str);         打印str字符串,并换行

4)gets

char str[32];
gets(str);         //获取字符串,存储到str空间内;
警告: the `gets' function is dangerous and should not be used.:gets没有越界保护,忽略这个警告

注意:

  1. gets会获取空格,会获取'\n',及制表符

【5】string函数族

头文件:
    #include 

strlen     求字符串长度
strcpy     字符串拷贝
strcmp     字符串比较
strcat     字符串拼接
bzero      清空字符串,将字符串全部清成'\0'
memset     内存置位

1)strlen

功能:求字符串长度,到'\0'位置为止,且不包含'\0';
格式:
    strlen(字符串数组名字);
例子:  
    char str[32] = "hello";
    sizeof(str); ====> 32bytes   共32个char类型元素
    strlen(str); ====> 5 bytes
    
    printf("strlen:%ld\n", strlen(str));

sizeof和strlen有什么区别?

  1. sizeof是计算所要建立的变量的空间大小。
  2. strlen是计算字符串的长度,到'\0',且不包含'\0'
  3. sizeof是运算符,而strlen是函数。
  4. sizeof是在编译时就计算好的,而strlen是在程序运行到该位置的时候,才计算的。

2)strcpy

功能:字符串拷贝; 将str1的内容拷贝给str2,到'\0'位置,且会将str1的'\0'拷贝给str2.
    注意:两个字符串的容量可以不相同,因为我们是以'\0'作为结束标识
    strcpy(字符串str2, 字符串str1);
例子:
    char str1[128] = "hello";
    char str2[100] ;
    strcpy(str2, str1);     
    printf("%s\n", str2);

3)strcmp

功能:比较两个字符串的大小;
格式:
    strcmp(str1, str2);
    若str1大于str2,则strcmp会返回大于0
    若str1等于str2,则strcmp会返回等于0
    若str1小于str2,则strcmp会返回小于0

注意:

  1. 字符串的大小比较于字符串的容量无关;
  2. 从str1和str2的下标0位置开始依次往后比较,
  3. 当比较到的数据不相同的时候,会停止比较输出结果。
  4. 当两个字符串同时结束,即同时比较到'\0',停止比较输出结果:两个字符串相等。

4)strcat

功能:字符串拼接,将str2拼接在str1后面;
格式:
    strcat(str1, str2);

5)bzero

功能:将字符串空间内的所有字符都清为0; 即'\0'
格式:
    char str[32] ;
    bzero(str, sizeof(str));         指定将sizeof(str)这么多个字节的空间内的数据全部置位0

6)memset

功能:内存置位,会将数据以字节为单位,置位指定的数值;
char str[128];
memset(str, 0, sizeof(str));     将str中sizeof(str)个空间中的每一个字节都置为0。
memset(str, 0, sizeof(str)); 等价于 bzero(str, sizeof(str));

memset(str, 1, sizeof(str));     将str空间中的每一个字节都置为1.

注意:memset是将每一个字节置为指定数据

3. 二维数组

【1】数组的概念

数组:一种 内存连续 ,且存储一组 数据类型相同 的数据结构。

【2】二维数组的定义

1)格式

一维数组:数据类型 数组名[容量];         int arr[12];

二维数组:数据类型 数组名[行数][列数];
int  arr[3][4];         申请了一个int类型的二维数组,共3行4列=12个元素,共12*4bytes = 48byte;
char brr[7][8];         申请了一个char类型的二维数组,共7行8列=56个元素,共56*1bytes = 56byte;

注意:二维数组每个元素在内存中依然是相邻的

2)二维数组的大小计算

sizeof(数组名)
int  arr[3][4]; 
sizeof(arr); ---->48bytes

3)二维数组的初始化

初始化:定义变量的同时赋值

    int arr[3][4];          //随机值

    int arr1[3][4] = {90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101};    //全部初始化
    int arr2[3][4] = {                                                      //全部初始化
        {90, 91, 92, 93},
        {94, 95, 96, 97},
        {98, 99, 100, 101}
    };

    int arr3[3][4] = {90, 91};  //部分初始化,初始化前面部分,后面默认初始化为0

    int arr4[3][4] = {0};       //部分初始化,初始化前面部分,后面默认初始化为0

    int arr5[3][4] = {
        {90, 91},
        {94},
        {95}
    };
    int arr6[][4] = {90, 91, 92, 93, 94};       //正确,2行4列

    /*
    //错误的
    int arr6[][];                               //错误的,不知道要申请几个字节                       
    int arr6[][] = {90, 91, 92, 93, 94};        //错误的,不知道几行几列
    int arr6[4][] = {90, 91, 92, 93, 94};       //错误的,因为无法通过行数推出几列
    */

【3】二维数组的访问及遍历

  1. 通过下标的方式访问,下标从0开始编号。
  2. 行号:0 ~ 行数-1
  3. 列号:0 ~ 列数-1

你可能感兴趣的:(c语言,c#,学习方法)