C语言小结

文章介绍了C语言中的数组概念,包括一维数组和二维数组的定义、初始化、访问方法以及内存占用。提到了数组初始化的不同情况,并讲解了冒泡排序算法。此外,文章还详细阐述了字符数组和字符串的处理,如初始化、赋值和输出。最后,讨论了函数的调用和定义,包括形参和实参的概念。
摘要由CSDN通过智能技术生成

 

1. 数组

1.1概念

一组数据类型相同的元素组合在一起

特点:1.数据类型相同;2.地址连续

 

2.2定义

存储类型  数据类型  数组名[元素的个数];

           Int    arr[5];

数据类型:数组中元素的数据类型

数组的数据类型:int [5];

数据类型:去掉变量名,剩下的就是数据类型;

数组所占的内存空间的大小 = sizeof(数据类型)* 元素的个数

 

数组名:1、整个数组

2、 数组首元素的地址  arr ==  &arr[0]   (获取一个变量的地址:&+变量名)

注意:定义数组时,元素的个数必须为一个确定的值(常量/常量表达式)

 

2.3初始化

 

总结:

1、 数组定义在函数体内,如果没有进行初始化,里面的所有元素是随机值(局部变量)

2、 数组定义在函数体外,如果没有进行初始化,里面的所有元素为0(全局变量)

3、 数组定义在函数体内,并且用static进行修饰,里面的所有元素为0(静态局部变量)

 

2.4访问

数组名[下标];    注意:下标从0开始;

 

总结

1、 int a[5];

a[5] = {1,2,3,4,5};   //error:a[下标]: 没有a[5] ; 就算有,只是一个int类型的元素

2. Int a[5];

a = {1,2,3,4,5};   //error:数组名==数组首元素的地址== &a[0];

3. Int a[ ] = {0};   //对,但意义不大:int a = 0;

4. Int a[ ];       //error:计算机并不清楚此时要分配多大的内存空间

 

2. 冒泡排序

思想:从左往右,两两依次比较,如果前一个数比后一个数大,就交换位置,反之,不变

N个数需要比较N-1趟,趟数+1,次数-1

 

3. 字符数组

字符数组:保存一组char类型的数据

存储类型  数据类型  数组名[元素的个数];

数据类型:数组中元素的数据类型

定义: char  str[10];//定义了一个字符数组str,该数组中可以存放10个char类型的字符

数组所占的内存空间== sizeof(char)*10 = 10

数组的数据类型:char [10];//去掉数组名

 

字符串:用字符数组来保存,字符数组的本质就是字符串;

 

给字符数组清零:

Char str[10] = {0}

Char str[10] = {‘\0’};

 

给字符数组进行赋值:

1、Char str[10] = { ‘h’,’e’,’l’,’l’,’o’ };

Str[5]----->str[9] ==’\0’;

“hello”  = ‘h’,’e’,’l’,’l’,’o’,‘\0’

1、 Char str[10] = “hello”;

 

//数组名就是数组首元素的地址

//&str[0] == str

 

4. 字符串的输入输出函数

4.1字符串的输出函数

%s:字符串

Printf(“ %s ”, str);

puts(数组名);

功能:将数组中的内容打印到终端,并且自动换行

注意:打印到‘\0结束

 

4.2字符串的输入函数

Scanf(“%s”,str);

gets(数组名);

功能:将输入的字符串保存在数组中,并且在末尾自动添加‘\0’

注意:gets不会进行越界检查,如果超出范围,就会操作未申请到的内存空间,段错误

出现段错误的原因:非法操作你没有申请的空间

 

4.3scanf和gets的区别

Scanf写在gets之上时,会出现异常情况(gets吃掉了‘\n’)

1、 gets以回车作为结束符,但是scanf以空格,回车TAB作为变量输入结束的标志

2、

缓冲区:

Gets在输入结束后,会自动清空缓冲区的内容

Scanf在输入结束后,会在缓冲区中遗留空格、回车、tab

输入:

Gets:进行输入时,回先去检查缓冲区的内容,如果缓冲区有内容,会率先输出缓冲区当中的内容

Scanf:键入,不会检查缓冲区的内容

 

4.4printf和puts的区别

puts会自动换行,而printf不会

 

5. 字符串的处理函数

5.1求字符串长度

strlen(数组名);

返回值:求得的字符串的实际长度,不包含’\0’

 

strlen和sizeof的区别:

1、 strlen求到的是字符串的实际长度,而sizeof求到的是申请到的内存空间的大小

2、 Strlen是一个函数,sizeof是一个运算符

案例:不使用strlen函数,求字符串的实际长度

 

5.2字符串的拷贝函数

Strcpy(数组1,数组2/字符串);

作用:将数组2中的内容拷贝给数组1,包含‘\0’,相当于完全拷贝

注意:数组1的容量要大于数组2

Strncpy(数组1,,数组2/字符串,n);

作用:将数组2或者字符串中的前n个字符拷贝给数组1

 

5.3字符串的连接函数

Strcat(数组1,数组2/字符串);

功能:将数组2中的内容连接到数组1中去,数组1中的’\0’会被覆盖

注意:数组1的容量要足够大(字符串1+字符串2)

Strncat(数组1,数组2/字符串,n)

功能:将字符串2的前n个字符连接到字符串1后

 

5.4字符串的比较函数

Strcmp(数组1/字符串1,数组2/字符串2);

功能:比较字符串1和字符串2的大小

返回值:

大于0:字符串1 > 字符串2

等于0:字符串1 == 字符串2

小于0:字符串1 < 字符串2

比较规则:从左往右,依次去比较字符串中的每个字符的ascii值,直到遇到不同的ascii码或者遇到‘\0’,结束比较

 

6. 二维数组

6.1概念

二维数组:(数组数组):一堆数组的元素组合在一起

元素为一维数组的一堆数组:1.数据类型相同,2.地址连续

(一维数组的元素的类型以及个数必须相同)

 

6.2定义

存储类型  数据类型  数组名[行数][列数];

          Int   arr[4][3] ;              //保存了4个一维数组

行数:一维整型数组的个数

列数:一维整型数组中元素的个数

实际的元素的个数:行数*列数

内存空间的大小:sizeof(数据类型)*行数*列数

数据类型:数组最里面的元素的数据类型

 

6.3初始化

行数可以省略,列数不可以省略

 

6.4访问

访问数组中的元素:数组名[下标名]

 

7. 二维字符数组

二维字符数组:

存储类型  数据类型  数组名[行数][列数];

           Char    str[3][10];

//相当于定义了一个二维数组str,数组中有3个元素,每个元素又是一个拥有10个char类型的一维数组

行数:字符串的个数(一维字符数组的个数)

列数:字符串最多可以保存几个字符(一维数组中元素的个数)

 

8. 函数

8.1概念

具有独立功能的模块

 

8.2调用函数

函数名(参数);

返回值:int(字符串的实际长度)

注意:参数的个数,以及参数的类型;返回值的类型(是否需要接收返回值)

 

8.3自定义函数

8.3.1自定义函数

存储类型  数据类型  函数名(形式参数列表)

{

函数体;

}

存储类型:auto、static、extern、register

数据类型: 返回值的数据类型(void)(数据类型省略不写,默认是int类型)

函数名: 见名知意

形式参数列表:(由程序员自己去确定!)要实现的功能需要几个参数,以及每个参数是什么类型

函数体:实现具体的功能

返回值:若没有返回值,void;返回值也可以省略,如果省略,默认int类型(返回有且只能有一个)

8.3.2调用函数

函数名(实际参数列表);

注意:

1、 需要将实参的值拷贝给形参,实参的个数以及数据类型要和形参一致

2、 实参,可以是变量,常量,表达式,但是必须是一个确定的值

3、 实参和形参是两块独立的空间

4、 传参,实际上是将实参的值拷贝给形参

5、 形参是局部变量,在函数调用时开辟空间,函数调用结束,立即释放

8.3.3函数声明

如果函数没有写在main函数之前,就需要声明;

声明:将函数头部直接复制粘贴至main函数之前,然后加上分号

声明的作用:帮助编译器做语法检查

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值