C-06\数组


一、一维数组

数组:表示同类数据的集合(业务功能一致且数据类型一样)

[]:

  • ? 定义时,表示数组身份与标志,其中数值表示数组元素的总个数
  • ? 定义以外使用时,表示下标运算,下标运算有两个操作符:指针类型和类整形(int、 short int、 char等)

下标运算的计算法则:

type ary[M] = ...;
int n = ...;

ary[n] address is: 
(int)ary + sizeof(type)*n

C语言规定只能逐个引用数组元素,而不能一次引用整个数组

数组的引用名是第0个元素的地址常量

二、二维数组

  • 多维数组是特殊的一维数组
  • 数组的引用名是第0个元素的地址常量
  • 多维数组取得基本数据元素需要做多次下标运算
  • 内存是线性的,是一维的,没有二维啥事

下标运算的计算规则:

type ary[M][N] = ...;
int x, y =...;

// ary[x][y] 两次下标运算
ary[x] address is:
    (int)ary + sizeof(type[N] * x)  // 得到一维数组
ar[x][y] address is:
    (int)ary[x] + sizeof(type) * y
    (int)ary + sizeof(type[N]) * x + sizeof(type) * y
推导:
    (int)ary + sizeof(type) * N * x + sizeof(type) * y (DEBUG版)
    (int)ary + sizeof(type) * (N*x + y)		(Release版)

三、数组传参

  • 传的是数组首地址
  • 形参int ary[8]中8可不写
  • 形参需要间接访问才能影响实参的值,有三个运算符会触发间接访问:[]、*、->。所以关键看形参是否用到了间接访问,不看形参类型(指针,数组等)

四、字符

  1. C语言的字符来源于电报
  2. \r表示回车,回到行头。\n表示换行,不会回到行头。微软用 \n包含了回车和换行,别的操作系统就不一定,所以为了兼容,使用\r\n

五、字符数组和字符串(数组)

  • 字符构成的数组是字符数组,字符串(数组)是一种特殊的字符数组,具有编码信息。
  • 字符串分为两个流派:C stylePascal style
    • Pascal style:首先描述数据有多大,然后后面紧跟着数据,没有结束符。不定长字符串的存储访问速率高
    • C style:开始就是数据,有特定的结束符(约好的)。更利于实时传输,不定长字符串的存储访问速率低

  • 微软的字符串,首先描述数据有多大,然后紧跟着数据,最后还有结束符,兼容两者
  • 只要涉及到地址赋值与转换就会触发C语言的强类型检测
  • __mbscpy:多字节cpy,带中文strcpy会默认使用此cpy
  • unicode输出带有中文字符串时使用wprintf不会打印出来或打印不正确,需要使用setlocale(LC_ALL,"chs")获取对应地区的unicode编码

六、附加知识

  • 加减乘除取模等数学类运算以及位运算得到的结果都是常量,不能被赋值
  • 32位系统:任何变量地址都是模4的地址,为了快速寻址
  • 安利书:计算机程序设计艺术,其作者为了出书花费十年写的Tex(排版软件)