C语言归纳四-数组

目录

一、数组的初始化

二、二维数组的定义、初始化赋值

2.1 定义

2.2 初始化赋值

三、C语言字符数组和字符串详解

3.1 定义

3.2 字符串的输入

3.3 字符串处理函数

四、C语言数组静态动态讨论

五、C语言数组越界问题

六、变长数组与普通数组

六、C语言数组的各种排序的代码


一、数组的初始化

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

最适应的代码还是王道上的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值