C语言笔记6

266 阅读4分钟

数组

定义

  • 由一系列类型相同的的数据依次排列组成
  • 组成数组的对象被称为数组的元素

声明

  • 元素类型 数组名[元素数量]
  • 元素数量不能是变量

类型

  • 元素类型[元素数量]

初始化

  • 元素类型 数组名[元素数量] = 初始化列表
int arr[3] = {1,2,3}  

若初始化列表短于数组长度 则剩下元素被填0 若长于 则无法编译
元素数量可不填
只能初始化一次 但可多次赋值
不一定要初始化但之后需要赋值
赋值不可使用初始化列表

访问元素

  • 数组名[下标]
  • 下标从0开始
    避免数组越界(下标大于等于元素数量)

eg 使用循环遍历数组元素

#include <stdio.h>
int main(      {
        int arr[5] = { 1, 2, 3, 4, 5 };
        for (int i = 0; i < 5; i++)
                printf("%d\n", arr[i]);
        return 0;
}   

修改元素

eg 修改数组第五个元素并打印

#include <stdio.h>
int main()
{
        int arr[5] ={};//所有元素初始化为0
        printf("%d\n", arr[4]);
        arr[4] = 5;//将第五个元素赋值为5
        printf("%d\n", arr[4]);/
        return 0;
}  
  • 数组不可整体赋值但可以使用循环单个赋值或内存复制

使用for循环为单个元素赋值

#include <stdio.h>
int main()
{
        int arr1[5] = { 1, 2, 3, 4, 5 };
        int arr2[5] = {};
        for (int i = 0; i < 5; i++)
        {
                arr2[i] = arr1[i];
                printf("%d\n", arr2[i]);
        }
        return 0;
}

使用内存复制 memcpy 需包含头文件#include<memory.h>

#include <stdio.h>
#include<memory.h>
int main()
{
        int arr1[5] = { 1, 2, 3, 4, 5 };
        int arr2[5] = {};
        memcpy(arr2, arr1, sizeof(arr2));
        for (int i = 0; i < 5; i++)
                printf("%d\n", arr2[i]);
        return 0;
}  

多维数组

其实就是套娃 把数组作为数组的元素

声明

  • 元素类型 数组名[外层元素数量][内层元素数量]
int arr[5][10]//表示数组arr中有五个元素 每个元素都是有十个元素的数组  

初始化

  • 元素类型 数组名[元素数量] = 初始化列表
int arr[2][3] = {
                  {1, 2, 3},
                  {1, 2}
          };    
              
   中间的花括号可省略 从而写成    
       
   int arr[2][3] = {
                  1, 2, 3,
                  1, 2
          }  

访问或修改元素

将原数组元素修改为原来二倍并访问

#include <stdio.h>
int main()
{
        int arr[2][3] = {
                1, 2, 3,
                1, 2
        };
        for (int i = 0; i < 2; i++)
        {
                for (int j = 0; j < 3; j++)
                {
                        arr[i][j] = arr[i][j] * 2;//修改二维数组值
                        printf("%d", arr[i][j]);//打印修改后的数组
                }
                printf("\n");
        }
        return 0;
}  

更高维度数组

如三维数组把二维数组作为元素 访问需要三重循环

字符数组

\0为字符串/字符数组结尾标识 (\0也算字符)

字符串常量

  • 每个字符占用一个字节 且末尾会附上\0指示字符串结尾 所以字符串常量大小等于字符数量加一

字符数组

  • 元素数量不填时 末尾附上'\0'为结尾标识 字符数组大小等于字符数量加一

初始化

  • char 数组名[元素数量] = 初始化列表
    元素数量可不填
  1. 使用字符串常量 末尾自动添加'\0'为结尾标识
    char str[20] = "helloworld"
    等价于char str[20] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '\0'}
  2. 使用初始化列表(字符数组) 且列表长度小于数组大小时 后面的元素会被初始化为'\0'
    char str[20] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}
    等价于char str[20] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '\0'}

打印

  • 可直接printf(str)
  • 可使用转换规范%s(字符串占位符)
#include <stdio.h>
int main()
{
        char str[20] = "helloword";
        printf(str);//打印结果为helloworld
        printf("\n");
        printf("%s", str);//打印结果为helloworld
        printf("\n");
        return 0;
}

字符串结尾标记'\0'

  • 字符串结尾必须有'\0' 字符数组可以没有'\0'
  • 若初始化列表是字符串 则数组长度应不填或者大于字符数量
  • 若初始化列表是字符 则最后一个字符应为'\0'且数组长度应不填或大于等于字符数量
  1. 初始化列表长度小于数组长度 后面的元素被填充为'\0' 字符串正常结尾
  2. 初始化列表长度等于数组长度 没有位置放'\0' 字符串无法结尾
  3. 初始化列表长度大于数组长度 无法通过编译
  4. 省略数组大小 如下
  1. 字符串常量
    char str[] = "helloworld"
    系统自动添加'\0' 所以字符串常量大小为11 正常结尾
  2. 字符常量
    char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '\0'}
    有11个字符常量 且最后一个为'\0' 正常结尾
    char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}
    有10个字符常量 且最后一个为'd' 无法结尾

测量字符数组中的字符串大小

使用循环

#include <stdio.h>
int main()
{
        char str[20] = "helloworld";
        int len = 0;
        for (; str[len] != 0; len++)
        {}
                printf("%d", len);
        return 0;
}

使用strlen

  • 接受字符串作为参数 返回值为字符串长度
  • 需包含头文件string.h
#include <stdio.h>
#include<string.h>
int main()
{
        char str[20] = "helloworld";
        int len1= strlen(str);//测量字符数组内字符串的长度
        printf("%d\n", len1);

        int len2= strlen("helloworld");//测量字符串常量的长度
        printf("%d\n", len2);

        printf("sizeof str %d\n", sizeof(str));//字符数组占用空间大小
        printf("sizeof helloworld %d\n", sizeof("helloworld"));//字符串常量所占空间大小
        return 0;
}  

image.png

字符数组的修改

字符常量不能被修改 但字符数组可以被修改

char str1[10]="string"; 这样初始化是可以的
char str1[10]; str1="string"; 指针str1是不能存放字符串的,只能具体赋值如:str1[0]='s';

eg把小写变为大写(ASCII-32)

#include <stdio.h>
#include<string.h>
int main()
{
        char str[20] = "helloworld";

        //修改前
        printf(str);
        printf("\n");

        //每个元素-32
        for (int i = 0; i < strlen(str); i++)
                str[i] = str[i] - 32;

        //修改后
        printf(str);
        return 0;
}  

getchar与putchar函数

  • getchar输入单个字符
char c = getchar()
  • putchar输出单个字符
putchar(c)  

用putchar输出字符串helloword

#include <stdio.h>
#include<string.h>
int main()
{
        char str[20] = "helloworld";
        for (int i = 0; str[i] != '\0'; putchar(str[i++]))
        {}
        return 0;
}