课程名称: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 语言中有时会进行 如 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 的撰写。
烫
的原因,即未初始化
或者 越界访问