• C语言基础(一)——函数和数组


    C语言基础(一)——函数和数组
      iwehdio的博客园:https://www.cnblogs.com/iwehdio/

    导图

    1、函数

    函数:一块代码,接收零个或多个参数,进行一些操作并返回零个或一个值。

    • 函数的定义:

      • 函数头:格式为 返回类型 函数名(参数列表)
        • 返回类型,void表示没有返回值。
        • 函数名,调用函数时使用的名称。
        • 参数列表:参数类型1 参数名1, 参数类型2 参数名2 。
        • 即使没有参数列表,定义和调用函数时也要加 圆括号 ( ) 。
      • 函数体
    • 函数的调用:

      • 格式:函数名(参数值)
      • 圆括号 () 起到了表示函数调用的作用。
      • 如果有参数,则需要给出正确的数量和顺序。这些值会被按照顺序依次用来初始化函数中的参数。
      • 函数知道每次是哪里调用它,会返回调用它的下一步。
    • 函数的返回:

      • 格式:return;return 表达式;

      • return 停止函数的执行,并送回一个值。

      • 这个返回的值可以赋值给变量,也可以再传递给函数。

      • 一个函数中可以有多个 return 。

      • 返回类型为 void 的不能使用带值的 return,也可以不使用return 。

      • 如果函数有返回值,必须使用带值的 return。

    • 函数的先后关系:

      • 函数的定义要在调用之前,因为C编译器自上而下顺序执行。
      • 也可以先将函数头放在调用之前,以分号结尾,称为函数的原型声明。
      • 函数的原型声明和函数定义的函数头必须一致。
      • 函数原型告诉编译器函数的名称、返回类型和参数类型。
      • 函数原型中参数可以只写类型,不写名称。也可以名称不一致。
    • 参数传递:

      • 可以传递给函数的值时表达式的结果,包括字面量、变量、函数返回值和计算的结果。
      • 如果传入的参数与函数定义的参数类型不同,会发生自动类型转换(C++/Java不会)。
      • C语言在调用函数时,永远只能传值给函数。
      • 每个函数每次运行时有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系。
    • 本地变量(局部变量):

      • 函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量
      • 定义在函数内部的变量就是本地变量,参数列表中的参数也是本地变量。
      • 对于本地变量,其生存期和作用域都是,变量所存在的大括号内——块。
        • 生存期:什么时候这个变量开始出现了,到什么时候它消亡了;
        • 作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)。
      • 本地变量是定义在块内的。
        • 它可以是定义在函数的块内,也可以定义在语句的块内,甚至可以随便拉一对大括号来定义变量(代码块)。
        • 程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了。
        • 块外定义的变量,在块内仍然有效。
        • 如果块内定义了与块外同名的变量,则块内的变量会覆盖块外的变量。
      • 本地变量不会被默认初始化,参数在进入函数时会被初始化。
    • 函数的其他问题:

      • 函数如果没有参数,参数列表应写 void ,不写参数表示的是不确定会传入怎样的参数。
      • C语言不允许函数的嵌套定义。
      • main 函数如果确定没有参数,可以写参数 void 。
      • main 函数的 return 0 是有意义的,表示程序运行正常。

    2、数组

    数组是一种容器,用来盛放数据。

    • 数组的特点:

      • 其中所有的元素具有相同的数据类型;
      • 一旦创建,不能改变大小;
      • 数组中的元素在内存中是连续依次排列的。
    • 数组的定义:

      • 定义格式:元素类型 变量名称[元素数量]
      • 元素数量必须是整数,C99之前元素数量必须是字面量。
    • 数组的索引:

      • 数组的每个单元就是数组类型的一个变量;

      • 使用数组时放在 [ ] 中的数字叫做下标或索引,下标从0开始计数,到数组的规模减一;

      • 索引格式:数组名称[索引值]

      • 数组索引可以出现在赋值的左边或右边,称为左值或右值。

      • 编译器不会检查数组下标越界,需要在程序中保证数组下标不会越界。

    • 数组的初始化:

      • 在数组使用前,对数组中每个单元赋初值。
      • 数组的集成初始化:元素类型 变量名称[]={数组中的值}
      • 数组的大小就等于集成初始化在的值的个数。
      • 如果int a[10]={2},表示第一个元素是2,其他元素是0。
      • 在C99中,可以使用定位初始化int a[10]={[1]=2, 4},表示索引为1的元素为2,索引为2的元素为4,也可以不指定数组大小10,会根据所指定的最大索引创建。
    • 数组的大小:

      • sizeof(数组名)得到的是数组中所占据的字节数。
      • 获取数组的大小:sizeof(a)/sizeof(a[0])
    • 数组的整体赋值:

      • 不能直接赋值,只能通过遍历数组。
    • 数组作为函数参数:

      • 函数头中的参数:元素类型 数组名[]
      • 不能再使用 sizeof 函数计算数组元素个数。
      • 必须再用另一个参数传入数组的大小。
    • 二维数组:

      • 定义格式:元素类型 数组名[m][n],可以理解为m行n列的矩阵。
      • 列数n必须给出,行数m可以由编译器数出。
      • 每行一个大括号 {} ,用逗号分隔。也可以没有大括号按序排列。
      • 如果省略则表示补零,也可以用定位初始化。
    • 数组的例子:找出小于某个数的所有素数。

      #include <stdio.h>
      
      int isPrime(int x, int knownPrime[], int length){
      	int res = 1;
      	int i;
      	for(i=0; i<length; i++){
      		if(x % knownPrime[i] == 0){
      			res = 0;
      			break;
      		}
      	}
      	return res;
      } 
      
      int main(void){
      	const int number = 30;
      	int logPrime[30] = {2};
      	int count = 1;
      	int i = 3;
      	while(number > count){
      		if(isPrime(i, logPrime, count)){
      			logPrime[count++] = i;
      		}
      		i++;
      	}
      	int j;
      	for(j=0; j<number; j++){
      		printf("%d", logPrime[j]);
      		printf("	");
      	}
      }
      

    参考:C语言程序设计(浙江大学):https://www.bilibili.com/video/av15267247
    iwehdio的博客园:https://www.cnblogs.com/iwehdio
  • 相关阅读:
    Python实现TCP服务端的并发
    python程序中的线程操作
    jmeter命令行执行脚本_动态参数设置
    App客户端性能测试点总结
    App功能测试点总结
    jmeter中生成UUID作为唯一标识符
    Python Unittest进行接口测试的简单示例
    jmeter接口测试中的用例数据分离
    博客园看板娘的简单添加
    (转)后端服务性能压测实践
  • 原文地址:https://www.cnblogs.com/iwehdio/p/12433527.html
Copyright © 2020-2023  润新知