C语言学习笔记(5)
1. 数组作为函数参数
函数是我们学习程序设计语言最基本的东西了,我在此不再赘述。只讨论一种特殊情况,就是数组作为函数的参数传递。
我们都知道,其实在传递数组的时候,实际上是传递了数组首元素的指针。明确了这一点之后,我们就可以思考下面的问题。
既然他只是传递了数组首元素的指针,那么他必然无法知道整个数组的大小,因此,我们如果希望在函数中用到数组的长度,必须要进行显式传递。
int Sum(int a[],int size){ int i ,sum=0; for(i=0;i<size;i++) { sum+=a[i]; } return sum;}
那么既然,函数无法检测传入数组的长度,我们也可以利用这一个特性来计算数组前N个数的和,或者是利用这一特性来告诉函数,实际上,数组的有效长度要小于数组的真实长度。
2. C99中变长数组作为函数参数
首先在数组一节中,我们谈到了C99中的变长数组是个很好的东西。那么我们来看看变长数组作为函数参数的情况。
我们看之前的代码,size和a[]并没有直接的联系,那么当变长数组作为参数就会解决这样的情况。
int Sum(int size,int a[size]){ int i ,sum=0; for(i=0;i<size;i++) { sum+=a[i]; } return sum;}
这个代码,则明确地表示了数组a的长度是size,也就是说在size和a[]之间建立起了直接的联系。
但是在这里我们需要注意一点,就是参数的顺序,长度一定要写在数组之前,否则会出现a[size]找不到size的错误。
在进行函数声明时,我们可以有以下几种方式:
int Sum(int ,int a[*]);int Sum(int n ,int a[n]);int Sum(int n, int a[*]);int Sum(int ,int a[]);int Sum(int n ,int a[]);
个人比较推荐第一种,因为我觉得第一种最为简便,而且可以表明a是一个变长数组。像第四种和第五种,我个人认为是两种很不好的方式。
3. C99中数组参数声明使用static
C99中允许在数组参数声明中使用关键字static。例如:
int Sum(int a[static 10],int n){ }
从函数本身来讲,static并没有对函数的本身实现造成任何影响。static 10的含义是数组的长度至少是10。那么当函数调用时,编译器会事先从内存中取出10个数,而不是在函数调用的时候才一次次的去取,这样就可以使函数的效率更高。
4. main函数的返回值
在初学C语言的时候,谭老的书上大部分都是这样的代码:
void main (){ printf("Hello world");}
但是实际上,这段函数有两个缺陷:
A. 从编程风格上来看,最好显式地声明main函数没有参数
B. main函数应该返回状态码,在某些操作系统中,程序终止时可以检测到状态码,来监视程序是否正常结束。即使你不需要这个状态码,其他人也可能需要。
因此,这个函数最好这样来实现:
int main (void){ printf("Hello world"); return 0;}
还记得我们之前说过exit(0)么,我们之前说,在main函数中写return 0和exit(0)是没有区别的。那么我们就来看看return 和 exit的区别。
exit属于<stdlib.h>头文件,我们之前说过,0是状态码中成功的意思,那么为了更直观,C标准库为我们提供了这样的两个宏定义。
int main (void){ printf("Hello world"); exit(EXIT_SUCCESS); //成é功| exit(EXIT_FAILURE); //失§败ü}
让我们转向定义可以发现:
/* Definition of the argument values for the exit() function */ #define EXIT_SUCCESS 0#define EXIT_FAILURE 1
在<stdlib.h>中的这两个宏定义。但是这两个值并不是固定的,而是由实现定义的。
另外,return 和 exit的一个最典型差异就是,在其他函数中调用return 不会引起程序的终止,但是无论在哪里调用exit都会引起程序终止,我们看一个程序。
int main (void){ printf("Begin\n"); BreakTest(); printf("End\n");} int BreakTest(){ return 0;}
这段代码不应该产生任何疑问:
接下来看下这段代码:
int main (void){ printf("Begin\n"); BreakTest(); printf("End\n");} int BreakTest(){ exit(EXIT_SUCCESS);}
由此可知,exit使整个的程序都被终止了。
转载于:https://www.cnblogs.com/dongzhiquan/archive/2011/06/17/2083237.html
C语言学习笔记(5)相关推荐
- 梓益C语言学习笔记之链表&动态内存&文件
梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...
- 6.方法(go语言学习笔记)
6.方法(go语言学习笔记) 目录 定义 匿名字段 方法集 表达式 1. 定义 方法是与对象实例绑定的特殊函数. 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例对象 ...
- 梓益C语言学习笔记之指针
梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...
- c语言中void arrout,c语言学习笔记(数组、函数
<c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...
- c语言float二进制输出代码_C语言学习笔记——学前知识概述
将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢! 前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望我的这本笔记能够对大 ...
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- C语言学习笔记---001C语言的介绍,编译过程原理,工具等
C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...
- go get 拉取指定版本_go语言学习笔记-基础知识-3
相关文档 go语言学习笔记-目录 1.简介 1.1 什么是GO Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.Go是从2007年末由Robert Griesemer, Rob ...
- 安装成功配置环境变量_go语言学习笔记-Windows10开发环境安装和环境变量配置
相关文档 go语言学习笔记-目录 1.安装 1.1.访问 https://golang.google.cn/dl/ 或 https://golang.org/dl/ 下载官方安装包 1.2.选择Win ...
- C语言学习笔记—code:blocks工具debug调试异常
C语言学习笔记-code:blocks工具debug调试异常 参考文章: (1)C语言学习笔记-code:blocks工具debug调试异常 (2)https://www.cnblogs.com/do ...
最新文章
- java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- 自动驾驶中可解释AI综述和未来研究方向
- IT人员健康信号之颈椎病自疗
- 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
- ORM框架greenDao 2 (用于了解旧版本的使用方法,目前最新版本为3.2.2,使用注释的方式来生成)...
- Ruby 之父:编程要给程序员带来乐趣
- POJ2806 Square
- Outlook和Foxmail里设置Gmail(Google)谷歌企业邮箱
- bzoj5369: [PKUSC2018]最大前缀和 (状压dp)
- Rhino6.25软件安装教程|兼容WIN10
- 中国汽车原始设备制造商的厂内物流市场趋势报告、技术动态创新及市场预测
- CSFR(跨站请求伪造)攻击与防御
- Linux服务器程序规范化
- 做短视频千万不要错过这5个视频素材网
- 2的10次方-1的python表达式_第二章PythonⅠ的基本语法,python,I
- JavaFX、计算器
- python生成一个20万数据_用Python分析了20万场吃鸡数据,有不少有趣的发现
- AssetStudioGUI获取Unity游戏资源
- AttributeError: ‘DatetimeProperties’ object has no attribute ‘weekday_name’ 的解决方法
- 从心出发,华展云2.0荣耀发布
热门文章
- 2019蓝桥杯C++B组 年号字串;完全二叉树的权值
- UnityGI4:混合光照
- Codeforces Round #467 (Div. 1): C. Lock Puzzle(构造)
- bzoj 1661: [Usaco2006 Nov]Big Square 巨大正方形(枚举)
- k8s中hostname, hosts文件, DNS和代理问题, service和pod的访问问题
- Prometheus 原理和实践,含docker部署Prometheus、node Exporters、Alertmanager、Push Gateway、grafana
- -矩阵-创建矩阵-简单方法
- Linux操作系统基本命令
- caffe常用格式binaryproto和leveldb
- Java中Link,set 和Map的区别,ArrayList,HashSet和HashMap的区别。