C语言基础语言总结(二)
文章目录
- 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;
}
函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数
形式参数就像函数内部的其他局部变量,在进入函数时被创建,退出函数时被销毁
两种向函数传递参数的方法
- 传值调用
把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数
实例:
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的值没有发生变化
引用调用
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作传递指针可以让多个函数访问指针所引用的对象,而不是把对象声明为全局可访问
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语言基础语言总结(二)相关推荐
- 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)
原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...
- Swift语言基础笔记(二)
接上一篇: Swift语言基础笔记(一)介绍了整形.浮点型.布尔类型,这篇接着介绍下字符.字符串.元组.可选型等类型. 字符和字符串的使用 //: Playground - noun: a place ...
- 一起学Go吧! Go语言基础语法篇二
文章目录 前言 Go 语言指针 Go语言结构体 Go语言切片(Slice) Go 语言范围(Range) Go 语言Map(集合) Go 语言类型转换 Go 语言接口 Go 错误处理 Go并发 通道( ...
- c语言基础深入理解二
指针基础 变量回顾 既然程序中的变量只是一段存储空间的别名 , 那么是不 是必须通过这个别名才能使用这段存储空间 ? 指针本质 ? 指针在本质上也是一个变量 ? 指针需要占用一定的内存空间 ? ...
- Go语言基础(十二):并发编程
文章目录 一.前言 二.goroutine 1.使用goroutine 2.启动goroutine示例 3.main优雅谢幕(sync.WaitGroup) 三.goroutine与线程 1.可增长的 ...
- PHP语言基础知识总结(二)
11.PHP中的读写分离方法例子:: a.https://www.cnblogs.com/we-jack/p/8204457.html b.https://blog.csdn.net/gxhacx/a ...
- C语言基础应用(二)数据的转换与输入输出
学习了C语言的基本数据类型后,我们可能会想这些数据如何进行运算,是否可以让不同类型的数据直接进行运算呢? 一.数据类型转换 1.1 int类型与float类型之间的转换 int i = 5; // j ...
- GO语言基础入门(二)
本篇内容主要是对于Go语言的基础及其相关特殊性语法进行总结. 字符串的拼接只能拼接字符串的变量,如果将整数和字符串进行拼接将导致编译错误. 如果需要在循环中拼接字符串,则使用空的字节缓冲区来拼接的效率 ...
- C语言基础篇 (二十五) 详解C语言第一大功臣:函数
文章目录 C语言为什么有函数? 函数书写的一般原则 函数是动词,变量是名词 函数的实质是:数据处理器 函数的基本使用 函数原型和作用 编译器的工作流程 C语言为什么有函数? 1.整个程序分成多个文件, ...
最新文章
- 《微信公众平台应用开发实战(第2版)》一导读
- 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)
- Leetcode 102.二叉树的层序遍历 (每日一题 20210628)
- 【数据结构与算法】之深入解析“石子游戏VII”的求解思路与算法示例
- 叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界
- 前端学习(2015)vue之电商管理系统电商系统之实现图片的预览效果
- DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算
- python批处理代码_【原创源码】【python】python文本文件批处理
- wincc按钮控制的vb脚本_VB操作wincc脚本心得.docx
- 第2章 创建你的第一个 LISP 程序 Creating Your First Lisp Progr
- 前端基础学习之Html标签
- linux shell 将命令行终端输出结果写入保存到文件中
- 【bzoj2219-数论之神】求解x^a==b(%n)-crt推论-原根-指标-BSGS
- 关于整型和浮点型的输出问题
- 【题解】PTA-Python题库 浙大版《Python 程序设计》题目集题解索引
- python如何使用sdk_如何通过Python访问Kvaser CANlib 软件开发包|Kvaser CANlib SDK的应用...
- 关闭WPS右键菜单,以及热点,广告弹窗推送
- 谢逸计算机网络,第一届中国计算机实践教育学术会议在南京成功举办
- 美国和欧洲5G最新进展—全球5G发展洞察2022(下)
- python 线性相关 与 线性拟合
热门文章
- 【node节点版本管理器NVM,详解安装教程,建议收藏】
- Android Studio——[The ‘kotlin-android-extensions‘ Gradle plugin is deprecated.]解决方案
- SQL——一种简单的基于角色控制的权限管理数据库设计DEMO
- Windows——Windows 10 加装 Windoes 7 制作双系统时,Windoes 7 启动卡在正在启动界面,并且重启无效解决方案
- BugKuCTF 杂项 多种方法解决
- 组合数(Combinatorial_Number)
- C++阶段01笔记06【函数(概述、定义、调用、值传递、常见样式、声明、分文件编写)】
- 微信小程序01【目录结构详解、视图与渲染、事件、input、scroll-view】
- Java读取Excel文件并将之写入数据库操作
- 第六届上海市大学生网络安全大赛 | Wp