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)相关推荐

  1. 梓益C语言学习笔记之链表&动态内存&文件

    梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...

  2. 6.方法(go语言学习笔记)

    6.方法(go语言学习笔记) 目录 定义 匿名字段 方法集 表达式 1. 定义 方法是与对象实例绑定的特殊函数. 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例对象 ...

  3. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  4. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  5. c语言float二进制输出代码_C语言学习笔记——学前知识概述

    将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢! 前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望我的这本笔记能够对大 ...

  6. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  7. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  8. go get 拉取指定版本_go语言学习笔记-基础知识-3

    相关文档 go语言学习笔记-目录 1.简介 1.1 什么是GO Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.Go是从2007年末由Robert Griesemer, Rob ...

  9. 安装成功配置环境变量_go语言学习笔记-Windows10开发环境安装和环境变量配置

    相关文档 go语言学习笔记-目录 1.安装 1.1.访问 https://golang.google.cn/dl/ 或 https://golang.org/dl/ 下载官方安装包 1.2.选择Win ...

  10. C语言学习笔记—code:blocks工具debug调试异常

    C语言学习笔记-code:blocks工具debug调试异常 参考文章: (1)C语言学习笔记-code:blocks工具debug调试异常 (2)https://www.cnblogs.com/do ...

最新文章

  1. java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
  2. 自动驾驶中可解释AI综述和未来研究方向
  3. IT人员健康信号之颈椎病自疗
  4. 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
  5. ORM框架greenDao 2 (用于了解旧版本的使用方法,目前最新版本为3.2.2,使用注释的方式来生成)...
  6. Ruby 之父:编程要给程序员带来乐趣
  7. POJ2806 Square
  8. Outlook和Foxmail里设置Gmail(Google)谷歌企业邮箱
  9. bzoj5369: [PKUSC2018]最大前缀和 (状压dp)
  10. Rhino6.25软件安装教程|兼容WIN10
  11. 中国汽车原始设备制造商的厂内物流市场趋势报告、技术动态创新及市场预测
  12. CSFR(跨站请求伪造)攻击与防御
  13. Linux服务器程序规范化
  14. 做短视频千万不要错过这5个视频素材网
  15. 2的10次方-1的python表达式_第二章PythonⅠ的基本语法,python,I
  16. JavaFX、计算器
  17. python生成一个20万数据_用Python分析了20万场吃鸡数据,有不少有趣的发现
  18. AssetStudioGUI获取Unity游戏资源
  19. AttributeError: ‘DatetimeProperties’ object has no attribute ‘weekday_name’ 的解决方法
  20. 从心出发,华展云2.0荣耀发布

热门文章

  1. 2019蓝桥杯C++B组 年号字串;完全二叉树的权值
  2. UnityGI4:混合光照
  3. Codeforces Round #467 (Div. 1): C. Lock Puzzle(构造)
  4. bzoj 1661: [Usaco2006 Nov]Big Square 巨大正方形(枚举)
  5. k8s中hostname, hosts文件, DNS和代理问题, service和pod的访问问题
  6. Prometheus 原理和实践,含docker部署Prometheus、node Exporters、Alertmanager、Push Gateway、grafana
  7. -矩阵-创建矩阵-简单方法
  8. Linux操作系统基本命令
  9. caffe常用格式binaryproto和leveldb
  10. Java中Link,set 和Map的区别,ArrayList,HashSet和HashMap的区别。