首页 > 其他分享 >【C语言】C语言零基础纯干货教学(下)

【C语言】C语言零基础纯干货教学(下)

时间:2024-05-26 22:58:26浏览次数:18  
标签:初始化 return 函数 int 教学 二维 干货 数组 C语言

在这里插入图片描述
个人主页~

C语言零基础纯干货教学(上)

C语言零基础纯干货教学(中)


C语言入门

四、数组

1、概念

数组是一组相同类型元素的集合,分为一维数组和多维数组,其中多维数组中二维数组用的最多,至于三维数组及其以后的多维数组在生产生活中用的是比较少的

2、一维数组

(1)一维数组创建

type name[n];

type是指数据类型,这里是你希望你创建的数组当中所有元素的数据类型
name是数组的名字
n是指数组的元素个数,是个常量,用方括号括起来
数组的类型是type[n]

(2)数组的初始化

C语言的初始化一般使用大括号,分为完全初始化以及不完全初始化

//完全初始化,此时数组元素的值就对应着这几个数字
int arr[5] = {1,2,3,4,5};
//不完全初始化,此时除了被初始化有值的元素外,其他的元素都是0
char ch[3] = {1};
//错误初始化,此时初始化的项数超过了数组的最大规格
double do[2] = {1,2,3};

3、一维数组的使用

(1)访问下标

一维数组通过下标访问来使用,数组的第一个元素的下标为0,最后一个元素的下标为n-1

(2)数组输入和打印

通过循环来进行输入和输出

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 1;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

在这里插入图片描述

4、一维数组在内存中的存储

数组在内存中是连续存放的,比如一个int[5]类型的数组,开辟一块内存,数组元素紧紧相连,找到头就可以找到整个数组
在这里插入图片描述

5、sizeof计算数组元素个数

sizeof(arr);
//可以求出整个数组的大小
sizeof(arr[0]);
//可以求出数组每个元素的大小
sizeof(arr)/sizeof(arr[0]);
//可以求出数组的元素个数

6、二维数组

(1)概念

将一维数组作为元素的数组叫做二维数组
在这里插入图片描述

(2)二维数组的创建

type name[m][n];

type是每个一维数组元素的数据类型
name是数组名
m表示数组有m行
n表示数组每一行有n个元素

7、二维数组的初始化

跟一维数组一样,没有被初始化的数据为0

int arr1[3][5] = {1,2};
//不完全初始化,除了被初始化的0行0个以及0行1个其他的数据都为0
short arr2[2][4] = {1,2,3,4,5,6,7,8};
//完全初始化
char arr3[3][4] = {{1,2},{3,4},{5,6}};
//按照行初始化,此时第0行1行2行第2个3个数据都为0

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

int arr1[][5] = {1,2};

8、二维数组的使用

(1)下标访问

与一维数组一样,二维数组是从0行0列开始的

(2)二维数组的输入输出

int main()
{
	int arr[7][6] = {0};
	for (int i = 0; i < 7; i++)
	{
		for(int j = 0;j < 6;j++)
		    arr[i][j] = i + 1;
	}
	for (int i = 0; i < 7; i++)
	{
		for (int j = 0; j < 6; j++)
			printf("%d ",arr[i][j]);
		printf("\n");
	}
	return 0;
}

在这里插入图片描述

9、二维数组在内存中的存储

我在上边给了一张图:
在这里插入图片描述
其实这个是不能表示二维数组在内存中的存储的,其实在第一行的最后一个数据与第二行的第一个数据是相邻存放的,我们在定义中提到过,二维数组的元素是一维数组,元素与元素之间是紧挨着的,所以每个一维数组之间也是紧挨着的,最终应该是一条直线而不是像上图一个的6*7的方格

五、函数

1、函数的概念

C语言中的函数就是一个完成某项特定的任务的一小段代码,函数作用很大,C语言程序一般都是由多个函数组成的,因为函数可以复用,大大提高了程序员的效率

2、库函数

C语言并不提供库函数,但编译器的厂商根据国际标准给出了一系列函数的实现,这些函数称为库函数,每个库函数都对应着一个头文件,使用这个库函数必须包含头文件

3、自定义函数

(1)概念

type name(a)
{
    b;
}

type是函数的返回类型,这些类型有:int,char,short,float,void(无类型,如果不想返回值,就使用void)等
name是函数名
a是形式参数
b就是函数体

(2)例子

加法函数

int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 1;
	int b = 2;
	int c = Add(a,b);
	printf("%d", c);
	return 0;
}

在这里插入图片描述

4、形参和实参

在上述例子代码中,a和b叫做实参,表示实际的参数,x和y叫形参,表示形式上的参数
形参是实参的一份临时拷贝,在传参的过程中,实参拷贝一份形成形参,由形参负责在函数中运算,在函数结束时,形参所占用的空间会被回收,形参消失

5、return语句

当return语句执行后,程序将彻底返回,后面所有的代码都不再执行
return后要有一个同type的值,如果不一样,就会强制转换成函数的type值
当type为void的时候,直接return就可以了
return后可以是一个数字,也可以是一个表达式,当是表达式时,先执行表达式再return表达式的值

6、数组做函数参数

当数组做函数参数时我们需要将整个数组传到函数当中,所以我们在参数中直接写入数组的名字,表示传参整个数组
这里有一条暗含的知识,直接写数组的名表示的是整个数组的地址,因为数组名就是地址,相当于将整个数组的地址取了出来,拷贝到形参当中,然后才在函数中进行函数活动

7、函数的声明和定义

(1)单文件

在这里插入图片描述
函数的定义:

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

函数的调用

int c = Add(a, b);

函数定义是一种特殊的声明,当函数体定义在使用之前时,相当于声明,但如果函数体定义在使用的下边,需要提前声明,否则编译器会认为使用的函数不存在

int Add(int x, int y);
//函数的声明
int main()
{
	int a = 1;
	int b = 2;
	int c = Add(a, b);
	printf("%d", c);
	return 0;
}
int Add(int x, int y)
{
	return x + y;
}

(2)多文件

在这里插入图片描述
新建头文件Add.h存放函数的声明,Add.c存放函数体,test.c使用函数

Add.c

在这里插入图片描述

Add.h

在这里插入图片描述

test.c

在这里插入图片描述

(3)extern和static

static可以用来修饰局部变量、全局变量以及函数
extern用来声明外部符号

①static修饰局部变量可以改变变量的生命周期,也就是改变了该变量存储的类型,我们知道内存中有多个区,原本该变量应该是存储在栈区,在栈区中的局部变量在该函数结束后就会被销毁,但被static修饰后会存储到静态区,生命周期就会与程序的生命周期相同,只有程序结束,变量才会销毁,可以理解成用static修饰的变量就会变成全局变量,不过它并不是全局变量,全局变量也存储在静态区
②static修饰全局变量会使该变量只能在本文件被使用,即使外部文件声明了也无法使用,也就是说static将全局变量的与外界相通的能力给掐断了,函数同上
③extern用来声明外部符号,如果在其他文件定义的符号我们想要在本文件使用,那么就可以用extern进行声明后使用

六、函数递归

1、概念

递归通俗来讲就是在函数中调用该函数,也就是自己调用自己

2、例子

(1)n的阶乘

#include <stdio.h>

int Func(int n)
{
	if (n == 0)
		return 1;
	else
		return n * Func(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Func(n);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述

函数的递归分为两个步骤,第一步为递推,第二步为回归

在这里插入图片描述

(2)斐波那契数列

int count = 0;
int Fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述

C语言的基础内容就到这里了~

在这里插入图片描述

标签:初始化,return,函数,int,教学,二维,干货,数组,C语言
From: https://blog.csdn.net/s_little_monster/article/details/138898008

相关文章

  • 【考研数据结构知识点详解及整理——C语言描述】第二章线性表的定义和基本操作
    25计算机考研,数据结构知识点整理(内容借鉴了王道408+数据结构教材),还会不断完善所整理的内容,后续的内容也会不断更新(可以关注),若有错误和不足欢迎各位朋友指出!目录 一.线性表的定义二.线性表的基本操作一.线性表的定义(1)线性表是具有相同数据类型的n(n>0)个数据元素的有......
  • 【C语言】10.C语言指针(1)
    文章目录1.内存和地址1.1内存1.2究竟该如何理解编址2.指针变量和地址2.1取地址操作符(&)2.2指针变量和解引⽤操作符(*)2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引⽤操作符2.3指针变量的⼤⼩3.指针变量类型的意义3.1指针的解引⽤3.2指针+-整数3.3void*指针......
  • 2024电工杯数学建模B题Python代码+结果表数据教学
    2024电工杯B题保姆级分析完整思路+代码+数据教学B题题目:大学生平衡膳食食谱的优化设计及评价 以下仅展示部分,完整版看文末的文章importpandasaspddf1=pd.read_excel('附件1:1名男大学生的一日食谱.xlsx')df1#获取所有工作表名称excel_file=pd.ExcelFile('附件1......
  • 二叉树遍历算法与堆数据结构详解(C语言)
    目录树的概念及结构二叉树的概念及结构概念二叉树的性质满二叉树和完全二叉树满二叉树完全二叉树深度的计算二叉树顺序结构及实现顺序存储堆的概念数组建堆向下调整堆的实现完整代码Heap.hHeap.cTest.c堆的初始化(实现小堆为例)插入数据删除堆顶的数据 ......
  • C语言----判断n是否是2的次方数,利用到按位与&,算法n&(n-1)
    //写一个代码,判断n是否是2的次方数//if(n&(n-1))==0/*2的0次方是1---二进制12的1次方是2---二进制102的2次方是4---二进制1002的一次方-1是1---二进制是12的二次方-1是3---二进制是112的三次方-1是7---二进制是111n与n-1按位与后&是0就是0,两个1才是1所以if(n&(n-1......
  • C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
    //编写代码实现:求一个整数存储在内存中的二进制中1的个数//第一种写法/*intcount_bit_one(unsignedintn){intcount=0;while(n)//除到最后余数是0,那么这个循环就结束了{//这个题就是可以想成求15的二进制的过程//每次都除以2,余数为1的时候就......
  • 【C语言】指针
    一:野指针概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)1、野指针成因(1)指针未初始化(2)指针越界访问(3)指针指向的空间释放2、如何避免野指针(1)指针初始化如果明确知道指针指向哪里就直接赋地址,如果不知道指针应该指向哪里,可以给指针赋值NU......
  • 轻松拿捏C语言——【字符串函数】的使用及模拟实现
    ......
  • C语言之指针详解(2)
    文章目录一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、二级指针五、指针数组六、指针数组模拟二维数组经过了上一讲的《C语言之指针详解(1)》的学习后,我想大家对于指针已经有了一定程度的了解,这章我们将继续学习C语言。这章主要讲的是数组与指针之......
  • C语言之指针详解(1)
    文章目录一、内存和地址1.内存2.地址3.如何理解编址二、指针变量和地址1.取地址操作符(&)2.指针变量和解引用操作符(*)2.1指针变量2.2如何理解指针类型2.3解引用操作符3.指针变量的大小三、指针变量类型的意义1.指针的解引用2.指针加减整数3.void*指针四、c......