目录
一、数组的初始化
int a[4] = {20, 345, 700, 22};
int a[10]={12, 19, 22 , 993, 344};
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0:
- 对于short、int、long,就是整数 0;
- 对于char,就是字符 '\0';
- 对于float、double,就是小数 0.0。
二、二维数组的定义、初始化赋值
2.1 定义
2.2 初始化赋值
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
按行连续赋值应该写作:
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
也可写作:
int a[][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
三、C语言字符数组和字符串详解
在C语言中,没有专门的字符串变量即string类型,通常就用一个字符数组来存放一个字符串。
3.1 定义
char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'};
// 给部分数组元素赋值,末尾没有'\0',所以长度只有9,而不是10
// 如果用printf("%s",c);的方法输出的话,会在结尾有乱码
// 因为'\0'是结束标识。
char str[30] = {"c.biancheng.net"};
char str[] = "c.biancheng.net"; //这种形式更加简洁,实际开发中常用
末尾一般是有一个不显示出来的'\0'的。,所以实际长度是t后还有一个'\0'。
注意,这个实际长度是指sizeof(str)/sizeof(char)。
strlen函数得到的长度是不包括'\0'的。
特别注意:
字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。
在很多编译器下,局部数据的初始值都是随机的、无意义的,而不是我们通常认为的“零”值。
请看下面的例子:
char str[7];
str = "abc123";
错误
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';
正确
在C语言中,字符串总是以'\0'
作为结尾,所以'\0'
也被称为字符串结束标志,或者字符串结束符。
'\0'
是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。
3.2 字符串的输入
- scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
- gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。换句话说,gets() 用来读取一整行字符串。
3.3 字符串处理函数
(1)字符串连接函数strcat()
strcat(arrayName1, arrayName2);
strcat() 将把 arrayName2 连接到 arrayName1 后面,并删除原来 arrayName1 最后的结束标志'\0'
。这意味着,arrayName1 必须足够长,要能够同时容纳 arrayName1 和 arrayName2,否则会越界(超出范围)。
(2)字符串复制函数strcpy()
strcpy(arrayName1, arrayName2);
strcpy() 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志'\0'
也一同拷贝。
(3)字符串比较函数strcmp()
字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。
四、C语言数组静态动态讨论
PHP、JavaScript 等解释型的脚本语言一般都支持动态数组,而 C、C++ 等编译型的语言一般不支持动态数组。
插入和删除数组元素都要移动内存,甚至重新开辟一块内存,这是相当消耗资源的。如果一个程序中有大量的此类操作,那么程序的性能将堪忧,这有悖于「C语言非常高效」的初衷,所以C语言并不支持动态数组。
五、C语言数组越界问题
如果下标小于零,就会发生下限越界(Off Normal Lower);如果下标大于等于数组长度,就会发生上限越界(Off Normal Upper)。
C语言为了提高效率,保证操作的灵活性,并不会对越界行为进行检查,即使越界了,也能够正常编译,只有在运行期间才可能会发生问题。由于C语言的”放任“,我们访问数组时必须非常小心,要确保不会发生越界。
六、变长数组与普通数组
变长数组是C99标准支持的升级。它支持数组长度用变量声明。例子如下:
#include <stdio.h>
int main()
{
int n;
printf("Input string length: ");
scanf("%d", &n);
scanf("%*[^\n]"); scanf("%*c"); //清空输入缓冲区
char str[n];
printf("Input a string: ");
gets(str);
puts(str);
return 0;
}
但是,注意,不是所有的编译器都支持这种写法,所以最好不要尝试。
另外,注意,变长数组的数组内存是在程序运行后确定的,普通数组的内存是在程序编译期间就分配好的。
六、C语言数组的各种排序的代码
http://c.biancheng.net/view/1840.html
最适应的代码还是王道上的。