【新手C语言】6.数组与函数

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

6.数组与函数

前面的都是小闹的东西
如果之前有人用之前的知识和你装X,那多半是个sb

下面,我们正式进入"基础的基础"的大门

数组

数组初步介绍

当我们要存储同一类型的多个变量时,我们使用数组
可以把数组看成一个篮子,相同类型的变量全部放进去

<数组类型> <名字> [大小]
int GroupA [100];

<类型> <名称> [元素数量]        这里的类型是指数组内部存储的数据的类型 
	int grades[100]; 
	doubke weight[20];

数组通过下标来访问对应位置的变量,下标从0开始
我们上面定义了大小为100的数组,则下标范围是0-99

另外,元素数量必须是整数
在C99之前:元素数量必须是编译时刻确定的字面量 (不能是变量、程序运行过程中动态产生的数字)

数组定义实例:

#include <stdio.h>
int main(){
	//写一个程序,计算平均数并输出大于平均数的数字 
	
	int x ;
	double sum = 0;
	int cnt = 0 ;
	int number [100]; //定义一个数组,其大小为100个 
	//int 名字A [大小X] 表示这个数组A里面最多可以放 X个int    
	
	scanf("%d",&x);
	while (x! = -1){
		number [cnt] = x ;  //让数组上cnt位置的那个单元=x ;而cnt是递增的,所以x分别会在1,2,3....位置上存放 
		//对数组中的元素进行赋值
		 
		sum += x ;
		cnt ++;
		scanf ("%d",&x);
	} 
	if (cnt > 0 ){
		printf("%f \n",sum/cnt);
		int i ;
		for (i = 0 ; i<cnt;i++){  //进行数组数字的输出。遍历数组
		//遍历数组:浏览整个数组 
		 
			if (number[i]>sum/cnt){//使用数组中的元素 
				printf("%d \n",number[i]);
				//当数组i位置的数符合条件,输出它 
			}
			
		} 
	}
	
	;return 0 ;
}

1.数组中的元素具有相同的数据类型
2.一旦创建,数组不能改变其大小
3.使用数组时在[]中的数字是下标/索引,下标从0开始计数
4.!!无论是编译器还是运行环境,都不会去检查下标是否越界,无论你在读还是写(segmentation fault)
5.数组中的元素在内存中是连续依次排列的
6.可以创建长度为0的数组,但是没什么锤子用

二维数组

我们把数放到一个方形区域里来,想象一个个方格!
二维数组的定义和使用同一维,不过它有两个中括号,代表行列,先行后列

遍历二维数组将利用嵌套循环

#include <stdio.h>
int main(void){
	int a [3][5] ; //定义了一个三行五列的矩阵,定义基本都是先行(y数)后列(x数)的
	int therow = 3 ; 
	int thecol = 5 ;
	//二维数组的遍历
	for(int i=0;i< therow ;i++){
		for(int j=0;j<thecol;j++){
			a [i][j] = (i+1)*(j+1) ;  //数组名字+数组下标,就可以表示这是一个普通的变量了,可以在一些地方直接使用
			printf("%d \n",a[i][j]);
		}
	}
	
	//二维数组初始化
	int b [][5] = {
		{1,2,3,4,5},
		{6,2,4,5,7},
		
	};
	/*
		列数是不可以省略的,函数可以让编译器自己整
		每个{}之间使用大括号隔开,最后一个的逗号存不存在无所谓,如果省略,表示“补零”
	*/
	
	; return 0 ;
}

函数

重头戏之一来了

定义函数

<返回值> <函数名字>(参数表){
函数执行,如果有返回值的话要return
}

比如我们定义一个加法的函数sum

void sum(int begin,int end){
	int i ; 
	int sum = 0 ; 
	for(i=begin ; i<=end ;i++){
		sum+= i;
	}
	printf("%d 到 %d的和是%d \n",begin,end,sum);
}

定义的函数要写在用它的地方之前才行,比如我想在主函数中使用sum函数,就要先写它
实例:

#include <stdio.h>
void sum(int begin,int end){
	int i ; 
	int sum = 0 ; 
	for(i=begin ; i<=end ;i++){
		sum+= i;
	}
	printf("%d 到 %d的和是%d \n",begin,end,sum);
}
/*
在这里,我们在主函数之前定义了一个自己的函数sum 
*/
int main (void){
	sum(1,10);//在这里,我们运用了自己的sum函数 
	sum(20,30);
	sum(35,45); 
	; return 0 ;
} 

显然,这样子并不美观,那么我们可以先用原型声明来“占位”

原型声明

我们可以现在最开始声明我们这个函数的基本内容,而不写执行代码
然后在主函数结束后,再在后面补上对应的执行代码
比如:

#include <stdio.h>
//C的编译器是由上而下来分析代码的,和eclipse不一样,这导致你要用的函数需要在前面先写出来
//这个在各编译器是不一样的,不过还是建议用的先写在前面

//但是可以把函数头加上分号放在前面,其它部分放在后面,这样就可以了。这个做法叫做  原型声明 
void sum (int a , int b);  //声明 

int main ()
{
	sum(1,10);
	; return 0 ; 
}

void sum (int a, int b){  //定义 
	int i ; 
	int sum = 0 ; 
	for (i =a ; i <=b ; i ++){
		sum +=1 ;  
	}
}

//另外,原型声明里面可以只给参数类型,不给参数名字。因为原型声明的意义就是让编译器知道有这个东西 

return

返回返回值的操作是必不可少的,而且要和你所声明的返回值对应
当然,如果你声明返回值是void(无),那就不用return了

#include <stdio.h> 、
//当使用void类型的函数时,函数是没有返回值的,也就是可以没有return 
int max (int a,int b)
{//返回值是int类型的函数max 
	int ret ; 
	if(a>b){
		ret = a ; 
	}else {
		ret = b ; 
	}
	return ret ; //返回一个ret的数值,另外在一个函数里面可以有多个return语句,而且return不一定要在尾(不过这不是单一出口,习惯不好) 
}

int main () {
/* return 
1.return 会停止函数的运行,并且返回一个值
2.写法  return <值> ;  或者  return[表达式] ;
 
*/
int a,b,c ; 
c = max(12,10);
printf("%d \n ",c);


return 0 ; 
}

参数传递和本地变量

说实话觉得这里有一点点点点深入了,不过还是写一下好了

函数每次运行都产生独立的变量空间
在这个空间中的变量是它这次运行独有的,称为本地变量
定义在函数内部的变量就是本地变量/局部变量
参数也是本地变量/局部变量

生存期:变量从出现到消失的时间
作用域:该变量可以起作用的范围
对于本地变量,二者属于一个范围,那就是大括号内,我们把他叫

1.本地变量是定义在块内的,可以是函数块内,也可以是语句块内
2.程序运行到某个块之前,该块其中的变量是不存在的,离开了之后,其中的变量也会消失
块外面定义的变量在块里面是依然生效的
3.如果块里面定义了和外面同名的变量,那么块内的变量会覆盖外面的 (Java不能这么干)
4.一个块中是不能定义同名变量的
5.本地变量不会被默认初始化,参数在进入函数的时候被初始化了

#include <stdio.h>
//以下内容请利用debug辅助理解

//这样的代码可以完成a、b数值的互换吗   答案是不可以 
void swap(int a , int b);

int main(void){
	int a = 5 ; 
	int b = 16 ; 
	
	swap(a,b);
	printf("a = %d b = %d",a,b);
	return 0 ;
}

void swap(int a,int b){
	//虽然在这里的参数是a b ,刚才传进来的数值也是a b ,但实质上二者是完全不同的东西
	//swap函数中,只是把a的值5,以及把b的值16 给到了swap的形式参数a b 里面,此ab非彼ab
	 
	int t = a ;
	a = b ; 
	b = t ;
}

其它

1.void f(void) 表示f函数没有参数
void f() 表示f函数的参数表未知(传统C)

2.逗号在圆括号内算作标点符号,而不是运算符
f(a,b) 传入a,b
f((a,b)) 传入(a,b),此时我们要的是(a,b)而非a,b。因此逗号会被当作运算符被使用

3.C语言不允许在函数里面定义函数

C啊,你是那么牛逼那么基础,又是那么捞

#include <stdio.h>
void swap(); //原型声明

int main(void){
	int a = 5 ; 
	int b = 6 ; 
	
	//原型声明的时候外面没有指定参数,在这里外面尝试传入两个int
	swap(a,b); //而事实上,我们的函数会对两个double进行处理,因此结果会出错(但是运行是正常的)
	printf("a = %d , b = %d \n",a,b);
	
	
	;return 0 ; 
}

//注意这里给的是double
void swap (double a , double b){
	int t = a ; 
	printf("IN SWAP,a = %f , b = %f  \n",a,b);
	a = b ; 
	
	b = t ; 
}

数组运算

因为有那么点承上启下的意思,所以放在这里了

集成初始化时的定位:
1.用[n]在初始化数据中给出定位
2.没有定位的数据会接在前面的位置后面
3.其它位置的数值同前文,补为0
4.也可以不给出数组的大小,让编译器自己算
5.这种做法比较适合初始数据稀疏的数组

#include <stdio.h>
int main (void){
	
	int a [] = {1,2,3,5,6,7};  //集成初始化
	for(int i=0;i<7;i++){  //这里提一句,很多时候习惯使用<某个阙值
		printf("%d \t",a[i]);
	}
	
	//如果一开始就规定了数组的大小,但是没有填充完数组,那么会把剩余未规定的部分全部初始化为0
	
	//int a [10] ={2};
	
	
	//int b[10] = {[0] = 2 , [2] =3 ,6 ,};  只能在C99下使用				
	
	//sizeof可以给出整个数组所占据的内容的大小,单位为字节。在整形数组中,一个单位4字节
	
	printf("\n %d \n",sizeof(a));
	printf("\n %d \n",sizeof(a[0]));
	printf("\n 所以a的大小就是 %d \n",sizeof(a) / sizeof(a[0]));
	
	//sizeof(a) / sizeof(a[0] 起到了Java中类似与length系列的作用

	; return 0 ; 
}

数组不能直接被赋值,像 int b [] = a 是不行的,我们只能使用遍历来完成这件事
数组作为函数参数时,我们习惯于用另一个参数来传入数组的大小————为什么呢,继续看下一篇吧

新手c语言讲解及题目分享(十四)--函数专项练习(二) 前一章我讲解了一些有关函数的部分内容,但已经足够开始编写程序。但还有些细节的地方和不理解的地方在这篇都会涉及到。主要包括函数中参数的传递,不同类型的结构作为函数参数和函数的嵌套等一些函数的进阶内容都会在本文中讲解。对我个人而言函数还是非常重要的,它可以是你的代码具有更高的可读性。这期题目分享全放到文章中。#define 宏名 宏体其中,#define 是宏定义命令,宏名是一个标识符,宏体是一个字符序列。#define 宏名(形参表列) 宏体。 阅读详情

相关推荐

新手c语言讲解及题目分享(十四)--函数专项练习(一)

c语言要求,在程序中遇到的所有函数,都必须“先定义,后使用”的原则。表明该函数是内部函数(static)还是外部函数(extern)。若为内部 函数,则该函数只能在定义它的文件中被使用,而不能被引用到其他文件中;若为外部函 数,则该函数可以被引用到整个程序的其他文件中。若省略函数的类别,系统则默认为外部 函数。类型标识符 函数名(形式参数表列) /*函数的首部,形式参数简称为形参*/声明部分执行部分类型标识符 函数名()声明部分执行部分注:若函数无返回值,可用类型标识符void表示。

qq_74267366的博客 1789

C语言数组函数

函数的声明是在告诉编译器,有一个函数叫什么,参数是什么,返回类型是什么。

qq_70985855的博客 1708

C语言——函数数组的简单介绍

带你了解函数数组的简单使用

VHhhbb的博客 1944

函数原型

1 #include<stdio.h> void sum(int begin,int end) { int i; int sum=0; for(i=begin;i<=end;i++){ sum+=i; } printf("%d到%d的和是%d\n",begin,end,sum); } int main() { int a,b; scanf("%d%d",&a,&b); sum(a,b); return 0; } 2 #include<std

weixin_51625231的博客 853

JavaScript的数组练习

1. 读取学生的10门课的成绩, 然后输出10门课成绩的最高分, 最低分, 总分, 平均分.   提示:把10门课的成绩保存如一个数组.2. 创建100个随机的10到60的随机整数, 然后分别统计每个数字出现的次数3. 定义一个函数, 判断数组中是否所有的数字都大于0    提示: 传入一个数组, 返回布尔值4. 封装函数: 把两个数组共同的元素放入一个新的数组, 并返回新的数组    提示: ...

LY_code的博客 9969

js数组数组函数

索引数组 var arr1 = []; //定义一个空数组 arr1[0] = 1; //向空数组中添加元素 arr1[1] = "hello"; arr1[2]=true; //可向数组中添加任意类型的数据,即混合数组 // 第二种创建空数组的方法 var arr2 = new Array(); //创建数组的同时初始化 var arr3 = [1,2,3]; var arr4...

qq_45122293的博客 471

《零基础看得懂的C语言入门教程 》——(九)C语言二维数组循环嵌套

一、学习目标 了解二维数组的使用方法 了解循环嵌套的使用方法 二、了解C语言的二维数组的使用方法 上一章我们学习了C语言的一位数组,知道了数组是相同类型值的集合,这一节学习C语言的二维数组。 一维数组可以当成是一排的数据,在这里我使用排队作为举例,在排队时只有一横排,没有纵列我们可以当成一维数组;这个时候队伍是一条线,只有横排的同学,例如第一个名叫小明、第二个叫小黄、第三个叫小绿一共有十个同学。 在数组中,是从0开始数数,第一个为数组名加一个下标0,如数组a写成a[0]指代第一个小明,a[1]则表示小

1_bit 的博客 1万+

C语言数组、结构体、结构体数组作为函数参数

数组作为函数参数 如果想把一个数组名参数传递给函数,正确的函数形参应该是怎样的?它是应该声明为一个指针还是一个数组? 调用函数时实际传递的是一个指针,所以函数的形参实际上是一个指针,但为了使程序员新手更容易上手一些,编译器也接受数组形式的函数形参。因此,下面这两个函数原型是相等的: int strlen(char *string); int strlen(char string[]); 结构体作为函数参数 举例结构体: typedef struct { char product[20]; } trans

chingax_csdn 1万+

新手如何学好C语言

作为一名资深码农,在软件行业也拼搏了十多年,这里跟想学习C语言的萌新童鞋分享下我的个人学习心得!!! 在大学时代,我们大二才开始学习C语言(起步有点晚啊),第一次看到那本黄黄的谭浩强老师的《c语言教程》,哈哈哈,就是这本了,满满的回忆啊! 开学拿到这本书后,心情很激动,因为以前总是羡慕那种黑客,好像很牛的样子, 抱着好奇的心理随便翻开了几页看了看,全程一脸懵逼, 因为以前从来没有接触过编程...

h a 6 6 6 c k 为 你解决复杂难题! 2951

【C语言数组函数

目录 1. 数组 1.1 由例子引入数组 1.2 数组的定义 1.3 数组举例 1.4 二维数组 2. 函数 2.1 由例子引入函数 2.2 函数的定义和使用 2.3 函数的参数和变量 2.3.1 函数声明 2.3.2 参数传递 2.3.3本地变量/局部变量/自动变量(作用域和声明周期) 2.4 其他细节 这个课程内容的安排真的是很有条理,由易到难,由浅入深。比如讲解函数数组之前,先通过例子说明为什么要引入它们,是为了方便解决某些问题的。而不是开篇就是数组是怎么定...

qq_42235129的博客 6815

C语言函数

C语言函数,自定义函数的写法,库函数的使用,以及重难点

2301_77878296的博客 1586

【C语言深入】再聊C语言中指针和数组到底有什么不同?!

C语言之所以要将传递给函数数组参数转换为指针,主要还是出于对效率的考虑,我们知道形参是实参的一份临时拷贝,但要是一个整型数组长度为1000,如果不把数组转换成指针,那这份拷贝岂不是要占了4000个字节的空间?而且这样传过去的数据函数内的数据是没有任何关系的,如果想要对主函数内的数据进行修改的话是做不到的。声明指针时,编译器只为指针变量本身分配了内存空间,而并没有为指针指向的对象分配任何空间,但在声明数组的时候,不管有没有对数组进行初始化,编译器都会为数组分配好空间,只是空间内的值是未知的。

kk702392702的博客 2243

C语言结构体指针数组小结

第一次写博客,有点小激动。话不多说,进入正题。 c语言最常见的几种东西:结构体,数组,指针和函数。单个定义很好理解,组合在一起就会让人头大。先说函数数组和指针的组合。 1、函数数组和指针的组合 包括指针函数函数指针、指针数组数组指针,先从根本上介绍这几者的区别。 为了直观理解,下面具体介绍: 1.1 数组指针 ...

qq_22393361的博客 4819

【C语言】初识C语言+进阶篇导读

C 语言是一门通用计算机编程语言,广泛应用于底层开发。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C 语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的 C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

weixin_59511824的博客 2878

C语言新手怎么快速掌握

摘要:本文为C语言新手提供4周高效学习方案,聚焦核心语法和实战训练。第一周掌握基础语法和编译流程,第二周学习数组和字符串处理,第三周攻克指针和结构体难点,第四周学习内存管理并完成实战项目。关键建议:1)避免死记硬背,以解决问题为导向;2)每个知识点立即实践;3)使用极简工具(VSCode+MinGW)。特别强调指针、内存管理等难点必须动手调试,并提供常见错误防范指南。学习路径遵循"核心语法→实战训练→补全原理"的递进逻辑,注重培养独立解决实际问题的能力。

2501_94265850的博客 1671

C语言必踩的10大坑,新手避雷指南

C语言作为一门经典且强大的编程语言,广泛应用于系统软件、嵌入式开发等众多领域。然而,对于新手来说,C语言中存在一些容易让人“踩坑”的地方。这些坑可能会导致程序出现各种难以调试的错误,影响开发效率。本文将为大家详细介绍C语言新手常踩的10个坑,并给出相应的避雷指南。

星辰夜语的博客 1209

C语言函数返回数组的4种方法(非常全面,新手必看)

虽然 C语言不支持直接返回数组,但我们有多种方法可以实现类似的功能。选择哪种方法取决于具体的需求,如数组大小是否固定、是否需要动态分配内存、是否需要返回额外信息等。在实际编程中,我们需要权衡这些方法的优缺点,选择最适合当前场景的解决方案。无论选择哪种方法,都要注意内存管理,避免内存泄漏和访问越界等常见问题。

数据结构和算法教程(C语言版) 1634

C语言入门必背18个经典程序,新手秒变编程达人

C语言作为一门广泛应用于系统软件、嵌入式开发等领域的编程语言,其重要性不言而喻。对于新手而言,通过学习和实践一些经典程序,能够快速掌握C语言的基本语法和编程技巧。本文将为大家介绍C语言入门必背的18个经典程序,帮助新手秒变编程达人。

星辰夜语的博客 2107

7.3 C语言数组指针

老吕将及时回复您的留言,并您共同探讨,以期为大家提供更为精准和有效的帮助。随着您在编程道路上的不断前行,愿这本专栏成为您的指南针,引领您探索C语言的无限可能。:这部分将带您了解C语言的起源、特点和应用,并引导您搭建开发环境,编写并运行您的第一个C程序。:在这部分,我们将深入探讨函数数组、指针、结构体、联合、枚举和预处理器等核心概念,这些都是理解和使用C语言的关键。在C语言中,将数组传递给函数实际上是通过传递指向数组第一个元素的指针来实现的。:指针的算术运算是基于指针指向的数据类型的大小进行的。

Python老吕的博客 1231
上一篇: 【新手C语言】4-5.循环
下一篇: 【新手C语言】7.基本搜索法(线性、二分)
RetenQ
博客等级 码龄6年 4粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值