C语言笔记(5)-数组

数组

  1. 数组的定义

    • 数组是一组数据的集合,用于将一种类型的数据存储到一段连续的空间中,可在一定程度上面加快搜索速度。

    • 组成数组的元素是若干个独立的变量,这些变量的类型必须相同。

    • 按照数组元素的类型的不同又可以分为:数值数组、字符数组、指针数组、结构体数组等。

    • 数组属于构造类型

      <存储类型> <数据类型> <数组名> [<常量表达式>]

    • 数组的类型实际上说的是数组元素的类型,其所有的元素数据类型是相同的。

    • 数组名不能与其他变量同名。

    • 数组结构与存储大小

      数组的存储空间在内存中是连续的,会根据数组元素的个数,来分配数组的大小

      数组的大小 = 数组元素的 *数组元素的个数;

      数组名用于记录数组首元素的地址,可以通过数组名来获取数组首元素的地址

  2. 一维数组

    一维数组的定义

    数据类型 数组名[常来那个表达式]

    • []:优先级是最高的,而且具有右结合性。

    • 数组的存储空间在物理上是连续的,所以访问数组的元素可以通过收元素的地址就加偏移量来访问。

      数组元素的地址 = 数组收元素的地址 + 下标 + 数组元素的大小

    • 若数组定义时指定n个元素,则数组下标的范围是0~n-1;

    • 注意:千万不能出现数组越界访问的问题,数组越界访问相当于内存访问越界,后果不可预知。如:定义 int a[n] = {0};却去访问a[n],就发生了越界,访问了未知内存

    一维数组初始化

    • 1.局部数组不初始化

      对于普通局部数组,若定义时未初始化,则数组中未初始化元素的值是不确定的。

    • 2.static数组不初始化

      static数组若定义时未初始化,则数组中的元素值默认为0。

    • 3.全局数组不初始化

      数组中的元素也会默认为0;

    • 4.全部初始化

      注意在对数组进行初始化使只能放在一行。

      如:int a[10] = {0,1,2,3,4,5,6,7,8,9,};

      这样写就是错的:int a[10];``a[10] = {0,1,2....}

      后面一句相当于是对数组调用,显然是错误的。

      数组初始化的复制方式只能用于数组的定义,定义之后再赋值只能一个一个元素的赋值

    • 5.部分初始化

      当{}中元素的个数小于元素的个数时,之后前面的元素赋值,后面的元素自动为0。

      利用该性质,将数组清0,如:a[10]={0}

    • 6.数组全部赋值

      若对数组中元素全部赋值则可以省略下标。

    • 7.数组全部初始化为0

      a[10] ={0}

      使用循环;

      使用库函数memset库函数:memset(数组名,初始化的值,素组大小);

      使用库函数bzero,将数组清零,头文件strings.h

      bzero(数组名,数组大小);

    一维数组的内存分配

    • 数组元素的个数:数组元素个数 = sizeof(数组名) /sizeof(数据类型)
  3. 多维数组

    • 定义形式:

      <存储类型> <数据类型> <数组名> <常量表达式> <常量表达式2>...<常量表达式n>

      多为数组知识增加了下标,其特性与一维数组基本相同。

    二维数组

    • 二维数组初始化

      • 1.降维给二维数组初始化,即按行初始化,每一组的初始值都用{}括起来。

        如:a[2][3] = {{1,2,3},{4,5,6}};

      • 2.按照线性存储给二维数组初始化

        a[][] = {1,2,3,4,5,6;

      • 3.可以省略左边下标的方式,给二维数组初始化

        如:a[][3] = {1,2,3,4,5,6}

        注意:第二维的长度不能省略

    • 二维数组的内存分配

      • 二维数组给我们平面的形式(行,列)但是实际上,二维数组也是在内存中也是连续的。即二维数组采用了和一位数组类似的存储方式。
      • 扩展:二维数组一维数组为元素
  4. 字符数组

    • 字符数组的定义

      有一定顺序关系的若干个字符变量的集合,就是字符数数组。

    • 字符数组初始化

      • 1.和普通数组相同,逐个进行初始化

        如:char a[5] = {'','','','',''}

        char b[][4] = {{'a','b','b','\0'},{'q','w','e','\0'}}

    • 字符数组初始化

      • 1.逐个赋值

      • 2.使用字符串常量

        char a[6] ="hello";

      字符串以\0,内存访问不能越界。利用字符串初始化字符数组的时候会默认加上\0。

  5. 字符串

    • 在C于艳红没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
    • 存放一个字符串时,编译器会自定加上’\0’作为结束标志。
    • 当一scanf函数输入字符串时,一空格作为字符串的结束符。

    字符串处理函数:

    • 1.字符串拷贝函数

      char *strcpy(char *dest,const char *src)

    • 2.字符串连接函数

      char* strcat(char* dest,const char* src)

      经字符串src连接到字符串dest的后面。

    • 3.字符串比较函数

      int strcmp(const char* s1,const char* s2)

      • 字符串相等,返回值为0
      • 字符串1>字符串2,返回值>0
      • 字符串1<字符串2,返回值<0
    • 4.求字符串长度

      size_t strlen(const char* s)

      • 返回字符串的长度,不包括\0
    • 5.字符串分界函数

      char* strtok(char* s,const char* delim)

      • 功能:将字符串分解成一个个片断
      • 参数:s为要分解的字符串,delim为分隔符字符串
      • 返回值:分解出的字符串的地址
  6. 注意点

    • 当程序中,需要用户输入一个字符串时,字符串输入函数gets,没有输入长度限制,若用户输入的字符太多会发生内存越界。
发布了49 篇原创文章 · 获赞 15 · 访问量 9282

猜你喜欢

转载自blog.csdn.net/wit_732/article/details/97949511