课程名称:C语言系统化精讲 重塑编程思想 打造坚实的开发基础
课程章节:第六章 玩转数组
授课老师:bennyhuo
课程内容
数组基础
数组就是一组相同类型的数,并从下标 0 开始索引。可以用如下三种方式赋值
int array[ARRAY_SIZE];
// 1. for 循环赋值
for( int i = 0 ; i < ARRAY_SIZE ; ++i){
array[i] = i;
}
// 2. 初始化列表赋值
double array_2[ARRAY_SIZE] = {0, 1, 2, 3};
// 3. C99 开始支持的特性 , 特定元素赋值
char array_char = {[2] = 'o'};
// char array_char[ARRAY_SIZE] = {[2] = '0' ,'l' ,'l'}
// 即从 索引2 开始赋值 为'0' 'l' 'l'
auto
变量在 msvc 中未开辟的数组中初值一般为 0xCCCCCCC
, 而在 gcc
中则不会做操作,完全取决于之前运行过该内存值为多少。故在 C 中一定要给数组赋初值。
而 static
则均为 0 。
数组的边界
C语言中数组不是边界安全的, 对数组进行越界的访问,等价于指针往后移,在编译时是不会报错,也不会检查。
只有在运行时才会报错。
而 C 语言不进行检查的原因是,只要程序员足够聪明,他是不会越界的,美其名曰 :相信程序员的设计哲学
- 总之,在C语言中要时刻记得检查内存边界。只要程序员自己检查,那么程序本身效率就会提高。
而我们在C 语言中有时会进行 如 array[var] 的操作,这是在C99 之后支持的(即VLA),也就是说在C90 中,程序员只能写常量访问,那么自然就会进行检查。
虽然如此,但在 C90 中 ,gcc 也对VLA 也做了支持,而 msvc 则不行。
字符串
而 C语言中字符串 和 字符数组大致相同,但字符串是以 \0 (0x00)
结尾。故单纯的字符数组需以0结尾才能 以 %s
格式化输出。
//字符数组
char char_vec[11] = "Hello World";
//字符串
char string[12] = "Hello Wolrd";
//也可以不写长度,中文gcc 默认用 utf8、msvc 默认为 gbk 编码
char string[] = "你好,中国" ;
// 宽字符,则为unicode
wchar_t ws[] = L"你好,中国" ;
数组类型参数
在 C中,传递数组等价于传 数组的地址,或者说仅传了一个指针。要想完成变长数组的传参,只能将参数一同传上去:
int SumArray(int array[] , int length)
//在leetcode 题目中,可以经常看到这种api 的撰写。
课程收获
- 了解了C99 支持的新赋值方法
- 知道了以前写出来
烫
的原因,即未初始化
或者越界访问
- 了解了语言中 的VLA 概念
- 了解了 utf8 和 gbk 分别在编译器的细节不同