文章目录

  • C函数
  • C作用域规则
  • C数组
  • C函数

定义函数的一般形式:

return_type function_name(parameter list)
{body of the function
}

return_type:返回类型,有些函数执行所需的操作而不返回值,在这种情况下,return_type是关键字void

function_name:函数名称,函数名和参数列表一起构成了函数签名

parameter list:参数列表,参数就像占位符。当函数被调用时,向参数传递一个值。参数列表包括函数参数的类型、顺序、数量

body of the function:函数主体包含一组定义函数执行任务的语句
求俩个数大小实列:

#include<stdio.h>int max(int num1,int num2)
{/*局部变量声明*/int result;if (num1>num2)result=num1;elseresult=num2;return result;
}

函数声明
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义

在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,应该在调用函数的文件顶部声明函数

调用函数
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序

例如:

#include<stdio.h>int mian()
{/*局部变量声明*/int a=100;int b=200;int ret;/*调用函数来获取最大值*/ret = max(a,b);printf("Max value is : %d\n",ret);return 0;
}/*函数返回两个数中较大的那个数*/
int max(int num1,int num2)
{int result;if(num1>num2)result = num1;elseresult = num2;return result;
}

函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内部的其他局部变量,在进入函数时被创建,退出函数时被销毁

两种向函数传递参数的方法

  1. 传值调用
    把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数
    实例:
void swap(int x,int y)
{int temp;temp = x;x = y;y = temp;return;
}

通过传递实际参数来调用函数swap():

#include<stdio.h>
void swap(int x,int y);
int main()
{int a =100;int b =200;printf("交换前a的值:%d",a);printf("交换前b的值:%d",b);swap(a,b);printf("交换后a的值:%d",a);printf("交换后b的值:%d",b);return 0;
}

上面的代码被编译执行后,结果如下:

交换前a的值:100
交换前b的值:200
交换后a的值:100
交换后b的值:200

虽然在函数内部改变了a和b的值,但实际上a和b的值没有发生变化

  1. 引用调用
    形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

    传递指针可以让多个函数访问指针所引用的对象,而不是把对象声明为全局可访问

void swap(int *x,int *y)
{int temp;temp = *x;*x = *y;*y = temp;return ;
}

通过引用传值来调用swap():

#include<stdio.h>void swap(int *x,int *y)
int main()
{int a = 100;int b = 200;printf("交换前a的值:%d",a);printf("交换前b的值:%d",b);swap(&a,&b);printf("交换后a的值:%d",a);printf("交换后b的值:%d",b);return 0;
}

编译执行后,结果为:

交换前a的值:100
交换前b的值:200
交换后a的值:200
交换后b的值:100
  • C作用域规则

作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。c语言中有三个地方可以声明变量:
1.在函数或内部的局部变量
2.在所有函数外部的全局变量
3.在形式参数的函数参数定义中

局部变量
在某个函数或块的内部声明的变量,它们只能被该函数或该代码块内部的语句使用
局部变量保存在栈中,只有在 所在函数被调用时才动态地为变量分配存储单元。局部变量被定义时,系统不会对其初始化

全局变量
全局变量定义在函数的外部,通常是在程序的顶部。全局变量在整个程序生命周期内都要效,在任何的函数内部都能访问全局变量
全局变量保存在内存的全局存储区中,占用静态的存储单元

形式参数
函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用

  • C数组

数组数据结构,它可以存储一个固定大小相同类型元素的顺序集合。

声明数组
要声明一个数组,需要指定元素的类型和元素的数量

type arrayName [ arraySize]

这叫一维数组。arraySize必须是一个大于0的整数常量,type可以是任意有效的c数据类型。

初始化数组

double balance[5]={1000.0,2.0,3.4,7.0,5.6}

大括号之间的值得数目不能大于方括号中指定得元素数目

所有的数组都是以0作为它们第一个元素的索引,也被称为基索引

访问数组元素
数组元素可以通过数组名称加索引进行访问

double salary = balance[9]

声明数组、数组赋值、访问数组实例:

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

多维数组
声明形式:

type name[size1][size2]...[sizeN];

二维数组,在本质上是一个一维数组的列表。声明一个x行y列的二维数组

type arrayName[x][y];

初始化二维数组:

int a[3][4] = {{0,1,2,3},   /* 初始化索引号为0的行 */
{4,5,6,7},   /* 初始化索引号为1的行 */
{8,9,10,11}   /* 初始化索引号为2的行 */
};

内部嵌套的括号是可选的,可以去掉

传递数组给函数
下面这个函数,它把数组作为参数,同时还传递了另一个参数,根据所传的参数,会返回数组中各元素的平均值

#include<stdio.h>double getAverage(int arr[],int size);int mian()
{int balance = {1000.0,2,3,17,50};double avg;avg = getAverage(balance,5);printf("平均值是:%f",avg);return 0;
}double getAverage(int arr[],int size)
{int i;double avg;double sum = 0;for (i=0 ; i<size ; ++i){sum += arr[i];}avg = sum/size;return avg;
}

从函数返回数组
c语言不允许返回一个完整的数组作为函数的参数,但是可以通过指定不带索引的数组名来返回一个指向数组的指针

如果想要从函数返回一个一维数组,必须声明一个返回指针的函数

int * myFunction()
{...
}

C语言不支持在函数外部返回局部变量的地址,除非定义局部变量为static变量

下面的函数,它会生成10个随机数,并使用数组来返回它们

#include<stdio.h>
#include<stdlib.h>
#include<time.h>/* 要生成和返回随机数的函数 */
int * getRandom()
{static int r[10];int i;/* 设置种子 */srand( (unsigned)time(NULL) );for ( i=0 ; i<10 ; ++i){r[i] = rand();printf("r[%d] = %d\n",i,r[i]);}return r;
}/* 调用上面定义函数的主函数 */
int main()
{/* 一个指向数组的指针 */int *P;int i;p = getRandom();for ( i=0 ; i<10 ; i++){printf("*(p + %d) : %d\n",i,*(p+i));}return 0;
}

指向数组的指针
数组名是一个指向数组中第一个元素的常量指针。因此,*(balance+4)是一种访问balance[4]数据的合法方式

一旦把第一个元素的地址存储在p中,就可以使用p、p+1、*(p+2)等来访问数组元素

#include<stdio.h>int mian()
{double balance[5] = {1000.0,2.0,3.4,17.0,5.6};double *p;int i;p = blance;printf("使用指针的数组值\n");for ( i = 0; i < 5; i++ ){printf("*(p + %d) : %f\n",i,*(p+i));}printf("使用balance作为地址的数组值\n");for ( i = 0; i < 5; i++ ){printf("*(balance + %d) : %f\n",i,*(balance+i));}return 0;
}

上面的实例中,p是一个指向double型的指针,这意味着它可以存储一个double类型的变量。一旦有了p中的地址,*p将给出存储在p中相应地址的值

C语言基础语言总结(二)相关推荐

  1. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  2. Swift语言基础笔记(二)

    接上一篇: Swift语言基础笔记(一)介绍了整形.浮点型.布尔类型,这篇接着介绍下字符.字符串.元组.可选型等类型. 字符和字符串的使用 //: Playground - noun: a place ...

  3. 一起学Go吧! Go语言基础语法篇二

    文章目录 前言 Go 语言指针 Go语言结构体 Go语言切片(Slice) Go 语言范围(Range) Go 语言Map(集合) Go 语言类型转换 Go 语言接口 Go 错误处理 Go并发 通道( ...

  4. c语言基础深入理解二

    指针基础 变量回顾 既然程序中的变量只是一段存储空间的别名 , 那么是不 是必须通过这个别名才能使用这段存储空间 ? 指针本质 ?  指针在本质上也是一个变量 ?  指针需要占用一定的内存空间 ?   ...

  5. Go语言基础(十二):并发编程

    文章目录 一.前言 二.goroutine 1.使用goroutine 2.启动goroutine示例 3.main优雅谢幕(sync.WaitGroup) 三.goroutine与线程 1.可增长的 ...

  6. PHP语言基础知识总结(二)

    11.PHP中的读写分离方法例子:: a.https://www.cnblogs.com/we-jack/p/8204457.html b.https://blog.csdn.net/gxhacx/a ...

  7. C语言基础应用(二)数据的转换与输入输出

    学习了C语言的基本数据类型后,我们可能会想这些数据如何进行运算,是否可以让不同类型的数据直接进行运算呢? 一.数据类型转换 1.1 int类型与float类型之间的转换 int i = 5; // j ...

  8. GO语言基础入门(二)

    本篇内容主要是对于Go语言的基础及其相关特殊性语法进行总结. 字符串的拼接只能拼接字符串的变量,如果将整数和字符串进行拼接将导致编译错误. 如果需要在循环中拼接字符串,则使用空的字节缓冲区来拼接的效率 ...

  9. C语言基础篇 (二十五) 详解C语言第一大功臣:函数

    文章目录 C语言为什么有函数? 函数书写的一般原则 函数是动词,变量是名词 函数的实质是:数据处理器 函数的基本使用 函数原型和作用 编译器的工作流程 C语言为什么有函数? 1.整个程序分成多个文件, ...

最新文章

  1. 《微信公众平台应用开发实战(第2版)》一导读
  2. 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)
  3. Leetcode 102.二叉树的层序遍历 (每日一题 20210628)
  4. 【数据结构与算法】之深入解析“石子游戏VII”的求解思路与算法示例
  5. 叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界
  6. 前端学习(2015)vue之电商管理系统电商系统之实现图片的预览效果
  7. DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算
  8. python批处理代码_【原创源码】【python】python文本文件批处理
  9. wincc按钮控制的vb脚本_VB操作wincc脚本心得.docx
  10. 第2章 创建你的第一个 LISP 程序 Creating Your First Lisp Progr
  11. 前端基础学习之Html标签
  12. linux shell 将命令行终端输出结果写入保存到文件中
  13. 【bzoj2219-数论之神】求解x^a==b(%n)-crt推论-原根-指标-BSGS
  14. 关于整型和浮点型的输出问题
  15. 【题解】PTA-Python题库 浙大版《Python 程序设计》题目集题解索引
  16. python如何使用sdk_如何通过Python访问Kvaser CANlib 软件开发包|Kvaser CANlib SDK的应用...
  17. 关闭WPS右键菜单,以及热点,广告弹窗推送
  18. 谢逸计算机网络,第一届中国计算机实践教育学术会议在南京成功举办
  19. 美国和欧洲5G最新进展—全球5G发展洞察2022(下)
  20. python 线性相关 与 线性拟合

热门文章

  1. 【node节点版本管理器NVM,详解安装教程,建议收藏】
  2. Android Studio——[The ‘kotlin-android-extensions‘ Gradle plugin is deprecated.]解决方案
  3. SQL——一种简单的基于角色控制的权限管理数据库设计DEMO
  4. Windows——Windows 10 加装 Windoes 7 制作双系统时,Windoes 7 启动卡在正在启动界面,并且重启无效解决方案
  5. BugKuCTF 杂项 多种方法解决
  6. 组合数(Combinatorial_Number)
  7. C++阶段01笔记06【函数(概述、定义、调用、值传递、常见样式、声明、分文件编写)】
  8. 微信小程序01【目录结构详解、视图与渲染、事件、input、scroll-view】
  9. Java读取Excel文件并将之写入数据库操作
  10. 第六届上海市大学生网络安全大赛 | Wp