C语言--数组

数组是存储于一个连续空间且具有相同数据类型的元素集合。C语言针对数组提供形式:一维数组,二维数组,多维数组,此篇文章先讨论一维数组。

一:一维数组:

1.定义的语法:类型说明符 数组名[常量表达式]

(1)类型说明符:用来说明要处理的数据的类型

(2)数组名:名字 --- 代表这个数组

(3)[常量表达式]: 整型常量表达式,表示的是,该数组中有多少个同类型的变量

eg:int score[10]:表示定义了一个数组,这个数组中有10个元素,每个元素类型是int型

2.初始化方式

方式1 -- 初始化列表:int score[10] = {1,2,3,4,5,6,7,8,9,10}; 初始化列表 --全部初始化

方式2 -- 部分初始化:int score[10] = {1,2,3,4,5}; 部分初始化,已初始化部分,挨个给值,未初始化的部分,默认给成0

全部初始化成 0 : int a[10] = {0};int a[10] = {};{} --- 初始化器

未初始化的数组:随机值(垃圾值)

数组长度可以省略,但是前提是,必须要有初始化的值,如:int a[]; 此时是错误的 --- 编译器也不知道有多大;int a[] = {1,2,3,4,5}; 编译器会根据给到的元素值的个数来推算出元素的个数(数组长度)

3.一维数组元素引用:需要说明引用的是哪个元素

语法:数组名[下标];下标 就是对应元素在数组中的编号,并且下标从0开始

4.数组越界:

(1) 编译器并不检查这种问题,作为程序员 自己小心

(2)数组下标的合法范围:[0~len-1] 

5.数组名:

(1)数据类型:数组名 --可以代表数组这种数据类型,sizeof(arr) --- 整个数组的大小

(2)代表值:代表的是数组对应空间的起始地址,数组名所代表的地址为数组首元素对应的地址

(3)数组下标:本质上是相对于首元素的偏移量(偏移了几个元素)

6.数组特点:连续性(一片连续的内存空间),有序性,单一性(同种类型 内存空间大小都相同)

补充:1)c99标准开始,数组长度可以是一个整型变量: int a[n];不能初始化

           2)数组不能整体操作,只能操作具体的元素 

7.关于排序:这里说一下选择排序与冒泡排序的思想,具体实现方式在此篇文章:C语言关于排序的实现-优快云博客

(1)找最大值

(2)逆序

(3)选择排序思想:给合适位置,选择合适的数

(4)冒泡排序:思想相邻两个元素两两比较 ,小的放前,大的放后

(5)二分查找:每次找到中间的一个值(二分法)进行判断

二:二维数组:C语言中,并不存在真正的二维数组;数组是一种数据类型,二维数组可理解为一维数组的一维数组。

1.二维数组的定义:数据类型 数组名[整型常量表达式][整型常量表达式];int a[5][6];

2.二维数组的初始化:

(1)全部初始化:int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

(2)按行初始化:int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

3.二维数组元素的引用:数组名[行下标][列下标];

4.二维数组的特点:满足数组特点:单一性,有序性,连续性

5.二维数组的理解:

(1)c语言中,并不存在真正的二维数组

(2)一维数组的一维数组

(3)二维数组在内存上,数据的存放和一维数组没什么区别

(4)二维数组是按行优先存储 

三:字符型数组:

1.字符型一维数组:char ch[10] = {'h','e','l','l','o','w','o','r','l','d'};

2.字符串:多个字符数据 --- 字符串( 一串字符 ---更在乎整体一个意思 )用来表示 一串字符,char ch[10] = "hello";

(1)字符串在c语言中,都是按字符型一维数组来处理的

(2)在字符串末尾会默认添加一个结束标志 '\0'

3.字符数组 与 字符串 
(1)字符数组 可以 用来 存放字符串数据

(2)字符串关心是字符串这个整体, 此时结束标志('\0')重要,而数组长度不那么重要了,编写代码时,数组长度可能不再需要,而是以结束标志作为判断依据

4.输出字符串的方式:

(1)puts():int puts(const char *s);

功能:输出字符串

参数:@s 表示存在字符串的空间的首地址

返回值:成功输出非负数,失败输出EOF

puts内部实现(默认自带\n)
    int i = 0;

    while (ch2[i] != '\0')
    {
        printf("%c",ch2[i]);

        ++i;
    }
     putchar('\n');

(2)char *gets(char *s);(建议使用fgets替换gets,gets比较危险)

功能:输入字符串

参数:@s  表示存放字符串的一块空间的首地址

返回值:成功返回就是s

gets内部实现:

方式1 
        do
        {
                str[i] = getchar();
        }while (str[i++] != '\n');
        str[i-1] = '\0';

方式2 
        while ( (str[i] = getchar()) != '\n')
                ++i;
        str[i] = '\0';  

4.字符串的输入:gets (),scanf() (如果输入的字符串中间有空格,只能接收空格前面的数据)
注意:空间尽可能足够,否则可能导致越界

5.字符串函数:

这些字符串函数的实现在此篇中:关于字符串函数的实现方式-优快云博客

(1)字符串的长度:指的是 '\0'前面字符的个数

(2)字符串长度计算:strlen();

size_t strlen(const char *s);

功能:计算字符串长度

参数:s --- 存在字符串的一块内存空间的首地址 

返回值:成功返回长度,size_t  --- long int 

(3)字符串拷贝:strcpy

char * strcpy(char *dest, const char *src;

功能:将src中的字符串 拷贝到 dest

参数:src  存放这源字符串的 一块空间的首地址,dest 存放字符串的目的空间的地址

返回值:成功返回dest空间的地址,失败返回NULL

(4)字符串拼接:strcat

char *strcat(char *dest, const char *src);

功能:拼接字符串

参数:dest拼接的目的字符串对应空间的首地址,src 源字符串对应空间的首地址

返回值:成功返回dest空间的地址,失败返回NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值