数组和函数重要知识点总结

本文详细介绍了C语言中数组的一维和二维数组的概念、创建、初始化、下标及内存存储,包括C99中的变长数组特性。此外,还深入探讨了函数的语法、形参与实参的关系、return语句的使用、数组传参的重点知识,以及嵌套调用、链式访问和static、extern关键字的应用。

一、数组

1.一维数组

数组是一组相同类型元素的集合
数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
数组中存放的多个数据,类型是相同的。

数组创建

⼀维数组创建的基本语法如下:

type arr_name[常量值];
  1. 存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。 type
  2. 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型 arr_name
  3. 指的是数组名的名字,这个名字根据实际情况,起的有意义就行。 []
  4. 中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。

数组初始化


int arr[5] = {1,2,3,4,5};//完全初始化

int arr2[6] = {1};//不完全初始化
//第⼀个元素初始化为1,剩余的元素默认初始化为0

int arr3[3] = {1, 2, 3, 4};
//错误的初始化 - 初始化项太多

数组下标

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下
标就相当于数组元素的编号,如下:数组元素和下标
在C语言中数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引用操作符。

注:
这个[ ]与数组创建的[ ]不一样,不要弄混了。

数组的存储

每两个相邻的元素之间相差4
数组在内存中是连续存放的。

sizeof计算数组元素个数

#include <stido.h>
int main()
{
    int arr[10] = {0};
    int sz = sizeof(arr)/sizeof(arr[0]);
    printf("%d\n", sz);
    return 0;
}

2.二维数组

把一维数组做为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。
整型、整型一维数组、整型二维数组

初始化时可以省略行,但是不能省略列

int arr[][5] = {1, 2, 3}

二维数组的下标

C语言规定,二维数组的行是从0开始的,列也是从0开始的

二维数组的输入和输出

#include <stdio.h>
int main()
{
    int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
    int i = 0;//遍历⾏
 //输⼊
    for(i=0; i<3; i++) //产⽣⾏号
    {
        int j = 0;
        for(j=0; j<5; j++) //产⽣列号
        {
            scanf("%d", &arr[i][j]); //输⼊数据
        }
    }
    //输出
    for(i=0; i<3; i++) //产⽣⾏号
    {
        int j = 0;
        for(j=0; j<5; j++) //产⽣列号
        {
            printf("%d ", arr[i][j]); //输出数据
        }
        printf("\n");
    }
    return 0;
}

二维数组的内存存储

二维数组中的每个元素都是连续存放的。
在这里插入图片描述

C99中的变长数组

C99中给一个变长数组的新特性,允许我们可以使用变量指定数组大小。
变长数组不能初始化。

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩
    int arr[n];
    int i = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

二、函数

C语言中的函数就是⼀个完成某项特定的任务的⼀小段代码。
在C语言中我们⼀般会见到两类函数:
库函数
自定义函数

C/C++官方的链接https://zh.cppreference.com/w/c/header
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/

库函数文档的一般格式

  1. 函数原型
  2. 函数功能介绍
  3. 参数和返回类型说明
  4. 代码举例
  5. 代码输出
  6. 相关知识链接

函数的语法形式

ret_type fun_name(形式参数)
{
}

ret_type 是函数返回类型,是⽤来表示函数计算结果的类型,有时候返回类型可以是 void ,表示什么都不返回
fun_name 是函数名,是为了方便使用函数;就像⼈的名字⼀样,有了名字方便称呼,函数有了名字方便调
用,所以函数名尽量要根据函数的功能起的有意义。
括号中放的是形式参数,函数的参数就相当于,工厂中送进去的原材料,函数的参数也可以是 void ,明确表示函数没有参数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。
{}括起来的是函数体,函数体就是完成计算的过程。

#include <stdio.h>
int Add(int x, int y)
{
    int z = 0;
    z = x+y;
    return z;
}
int main()
{
    int a = 0;
    int b = 0;
    //输⼊
    scanf("%d %d", &a, &b);
    //调⽤加法函数,完成a和b的相加
    //求和的结果放在r中
    int r = Add(a, b);
    //输出
    printf("%d\n", r);
    return 0;
}

Add函数也可以简化为:

int Add(int x, int y)
{
    return x+y;
}

形参和实参的关系

形参是实参的⼀份临时拷贝。

return语句注意事项

return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执行表达式,再返回表达式
的结果。
return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。
return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。
return语句执行后,函数就彻底返回,后边的代码不再执行。
如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。

数组传参的几个重点知识

函数的形式参数要和函数的实参个数匹配
函数的实参是数组,形参也是可以写成数组形式的
形参如果是⼀维数组,数组大小可以省略不写
形参如果是⼆维数组,行可以省略,但是列不能省略
数组传参,形参是不会创建新的数组的
形参操作的数组和实参的数组是同⼀个数组

根据上述的信息,我们就可以实现这两个函数:

void set_arr(int arr[], int sz)
{
    int i = 0;
    for(i=0; i<sz; i++)
    {
        arr[i] = -1;
    }
 }

void print_arr(int arr[], int sz)
{
 int i = 0;
 for(i=0; i<sz; i++)
 {
 printf("%d ", arr[i]);
 }
 printf("\n");
}

嵌套调用和链式访问

嵌套调用

例如:计算某年某月有多少天

//如果是闰年,返回1
//如果不是闰年,返回0
//判断y是否闰年
int is_leap_year(int y)
{
	if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
		return 1;
	else
		return 0;
}

//获取某年某月有多少天
int get_days_of_month(int y, int m)//1990 3
{
	int days[13] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
		//           0  1  2  3  4  5  6  7  8  9  10 11 12
	int d = days[m];
	if (is_leap_year(y) && m == 2)
	{
		d += 1;
	}
	return d;
}

int main()
{
	int y = 0;//年
	int m = 0;//月
	scanf("%d %d", &y, &m);//1990 3
	int d = get_days_of_month(y, m);
	printf("%d\n", d);
	return 0;
}

链式访问

将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问。

#include <stdio.h>
int main()
{
	int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度
	printf("%d\n", len);//2.打印⻓度 
	return 0;
}

system用来执行系统命令

需要引用头文件<windows.h>

Sleep 休眠,单位是毫秒

需要引用头文件<string.h>

函数的声明和定义

函数调用之前需要先声明,函数声明中参数只保留类型,省略掉名字也是可以的。
函数的调用⼀定要满意,先声明后使用。

static和extern

作用域

局部变量的作用域是变量所在的局部范围。
全局变量的作用域是整个工程。

生命周期

局部变量的生命周期是:进⼊作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。

static

static是 静态的 的意思,可以用来:
修饰局部变量
static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被static修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,生命周期就和程序的生命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作用域不变的。
**使用建议:**未来⼀个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static
修饰。
修饰全局变量
extern 是用来声明外部符号的,如果⼀个全局的符号在A文件中定义的,在B文件中想使用,就可以使extern进行声明,然后使用。
⼀个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。本
质原因是全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的声明就可以使用;但是全局变量被static修饰之后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用 了,其他源文件,即使声明了,也是无法正常使用的。
**使用建议:**如果⼀个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。
修饰函数
static 修饰函数和static修饰全局变量是⼀模⼀样的,⼀个函数在整个工程都可以使用,被static修
饰后,只能在本文件内部使用,其他文件无法正常的链接使用了。
**使用建议:**⼀个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用static修饰。

extern

extern 是用来声明外部符号的,如果⼀个全局的符号在A文件中定义的,在B文件中想使用,就可以使用extern进行声明,然后使用。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值