1、函数的定义

函数的定义就是函数体的实现.

语法:

类型

函数名(形式参数)

代码块

函数返回类型和函数名分开写是代码风格的问题,现代语言如swift返回值在函数名和参数表的后面,这样使得某些工程工具追踪源代码时更容易查找函数名.

K&RC 的旧式声明:

int *

find_int(key, array, array_len)

int key;

int array[];

int array_len;

{

}

为了兼容一些旧的编译器,C标准保留了这种声明格式

2、函数的声明

2.1 函数原型 (function prototype)

函数原型用于向编译器提供函数信息.格式上就是函数定义的起始部分+分号.

2.2 函数的缺省认定

当程序调用一个无法见到原型的函数时,编译器便认为该函数返回一个整型值.

3、函数的参数

C函数的所有参数均以“传值调用”方式进行传递,这意味着函数将获得参数值的一份拷贝.这样函数可以放心的修改这个值,而不必担心会修该调用程序实际传递给它的参数.

有个例外,如果被传递的参数是一个数组名,并且在函数中使用下标引用该数组的参数,那么在函数中对数组元素进行修改实际上修改的是调用程序中的数组元素.函数将访问调用程序的数组元素,数组并不会被复制,这就是“传址调用”

但是,实际上,传递数组做为参数时是传递的指针的一个拷贝.从这个角度考虑,C函数的所有参数均以传值调用.

传值点用的一个例子:

/**
对值进行奇偶校验 @param value 整型参数值
@param n_bits 数值的有效位数
@return 1 : 偶数个 0 : 奇数个
*/
int
even_parity(int value, int n_bits){
int parity = 0;
//计数值中值为1的位的个数
while (n_bits > 0) {
parity += value & 1;
value >>= 1;
n_bits -= 1;
}
//如果计数器的最低位是0,返回TRUE,表示1的位数为偶数个
return (parity % 2) == 0;
}
//交换调用程序中的两个整数值(无效),因为它实际交换的是参数的拷贝
void
swapX(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
} //传递指向希望修改的变量的指针,
void
swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
} //调用时
swap (&a, &b);//要传递指针

C和C指针小记(十)-函数的更多相关文章

  1. C和C指针小记(十二)-函数的可变参数表

    1.可变参数表是通过宏实现的 宏定义于stdarg.h头文件,它是标准库的一部分.这个头文件声明了一个类型var_list和三个宏--va_start.va_arg.va_end. 我们可以声明一个类 ...

  2. C和C指针小记(十八)-使用结构和指针-双向链表

    1.双链表 1.1 双向链表的声明 在一个双链表中,每个节点都包含两个指针--指向前一个节点的指针和指向后一个节点的指针. 声明 typedef struct NODE { struct NODE * ...

  3. C和C指针小记(十六)-动态内存分配

    动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. ...

  4. C和C指针小记(十四)-字符串、字符和字节

    1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...

  5. C和C指针小记(十五)-结构和联合

    1.结构 1.1 结构声明 在声明结构时,必须列出它包含的所有成员.这个列表包括每个成员的类型和名称. struct tag {member-list} variable-list; 例如 //A s ...

  6. C++(二十二) — 指针变量、函数指针、void指针

    1.指针变量 (1)指针变量必须在初始化后才可以正常使用,初始化就是给他分配一个有效的数据地址. 先初始化,后使用. (2)指针可以进行加减运算,++ 或者 --:将指针的位置向前或者向后移动一个数据 ...

  7. (C/C++学习笔记) 十. 函数

    十. 函数 ● 基本概念 函数 函数定义 function definition: return_type function_name ( parameter list ) { Body of fun ...

  8. 构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)

    十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...

  9. C和指针 第十二章 结构体 习题

    12.3 重新编写12.7,使用头和尾指针分别以一个单独的指针传递给函数,而不是作为一个节点的一部分 #include <stdio.h> #include <stdlib.h> ...

随机推荐

  1. 【Spark 深入学习 02】- 我是一个凶残的spark

    学一门新鲜的技术,其实过程都是相似的,先学基本的原理和概念,再学怎么使用,最后深究这技术是怎么实现的,所以本章节就带你认识认识spark长什么样的,帅不帅,时髦不时髦(这货的基本概念和原理),接着了解 ...

  2. (3) MySQL分区表使用方法

    1. 确认MySQL服务器是否支持分区表 命令: show plugins; 2. MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(HASH) HASH分区的特点 根 ...

  3. 【Android】开源项目UniversalImageLoader及开源框架ImageLoader

    UniversalImageLoader 简单来说就是用于加载图片的一个开源项目,在其项目介绍中是这么写的 支持多线程图片加载 提供丰富的细节配置,比如线程池大小,HTPP请求项,内存和磁盘缓存,图片 ...

  4. dom4j string转为xml

    /**XML转字符串 */ Document document = new SAXReader().read(new File("E:test.xml"));;  String t ...

  5. 【转】Centos7安装nodejs

    下载及安装步骤: cd /usr/local wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz tar xvf no ...

  6. MXNET:欠拟合、过拟合和模型选择

    当模型在训练数据集上更准确时,在测试数据集上的准确率既可能上升又可能下降.这是为什么呢? 训练误差和泛化误差 在解释上面提到的现象之前,我们需要区分训练误差(training error)和泛化误差( ...

  7. 快播王欣发布匿名IM社交软件“马桶MT”

    2019年1月14日,快播王欣推出了一款匿名IM社交软件——马桶MT,它的灵感像是来自于美国的匿名分享应用Secret(已关闭). 原快播创始人王欣近日在微博预告了其新公司云歌人工智能推出一款全新社交 ...

  8. Java知多少(96)绘图之设置字型和颜色

    Java绘图中,显示文字的方法主要有三种:(1)drawString(String str,int x,int y):在指定的位置显示字符串.(2)drawChars(char data[],int ...

  9. R语言使用RMySQL连接及读写Mysql数据库

    简单说下安装过程,一般不会有问题,重点是RMySQL的使用方式. 系统环境说明 Redhat系统:Linux 460-42.6.32-431.29.2.el6.x86_64 系统编码:LANG=zh_ ...

  10. idea java 非web程序打包

    以下打包非常暴力.O(∩_∩)O哈哈~ 方法一: 第一步:选择需要打包的程序 第二步:选择需要打包的文件 第三步:artifacts->jar->from modules with... ...