- 浏览: 886101 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (198)
- Linux/Unix (38)
- TinyOS / NS-2 for『WSN』 (44)
- 思想的拼图 (5)
- 开源 OpenSource (2)
- Framework 开发框架 (0)
- Software Engineering 软件工程 (2)
- IT项目管理 (6)
- Networking 网络技术 (2)
- Java (6)
- C语言 ANSI C (22)
- .NET / C# (9)
- C++ (12)
- Web 语言 Html/Xml (5)
- Groovy on Grails (1)
- Algorithm 算法 (1)
- Database 数据库技术 (5)
- Tools (21)
- VM 虚拟机 (3)
- WSN (wireless sensor network) (2)
- Linux 命令专辑 (3)
- PHP (0)
- 办公软件 (3)
最新评论
-
cfczdws:
感谢楼主,查了半天终于发现居然是htmlentities()做 ...
htmlentities()函数把中文转成了乱码 -
decoxiaohan:
这本书的名字 有谁知道????~~~
OMNeT++中文用户手册(完全版) -
huonie:
怎么下载啊
OMNeT++中文用户手册(完全版) -
huonie:
没有内容啊
OMNeT++中文用户手册(完全版) -
kyx0413:
谢谢先 先看看
OMNeT++中文用户手册(完全版)
同其它变量一样,数组也可以作函数的参数。数组元素只能作函数实参,且同其它变量的用法没有区别。
我们已经知道,数组元素要通过数组名和相应的下标一个个地引用,而数组名可以作函数的实参和形参。当数组作为函数参数时,调用函数中的实参数组只是传送该数组在内存中的首地址,即调用函数通知被调函数在内存中的什么地方找到该数组。在前面我们已经知道了函数参数的值传递方式,调用函数向被调函数传递数据地址的方式,称之为函数参数的引用传递。
对于函数参数的引用传递,除传送数组名外,调用函数还必须通知被调函数:数组有多少个元素。所以,有数组参数的函数原型的一般形式为:
类型说明符 函数名(数组参数, 数组元素个数)
数组参数并不指定数组元素的个数,即[]中是空的,没有数字。例如6-21:
我们已经知道:函数参数的引用传递不同于值传递。值传递时是把实参的值复制到形参,实参和形参占用不同的存储单元,形参值的改变不会影响到实参。而数组作为函数参数传递时,是引用传递方式,即把实参数组在内存中的首地址传给了形参,被调函数可以通过该地址,找到实参数组中的各个元素。这就意味着:在被调函数中,如果改变了形参数组某元素的值,在被调函数中,实参数组对应元素的值也会发生相应的改变。
例6-21
例6-22
下面我们看看应该怎样调用上面的mean函数:
例6-23
传值调用与传址调用的区别在于,使用传值调用时,函数接收的是函数值的一份拷贝;另一方面,使用传址调用时,函数接收的是变量的内存地址。因此,函数能改变存放于指定内存单元(也就是变量值)的值,所作的改变在函数结束后继续保留下来。
函数参数的引用传递是有用的。例如当数组作函数参数时,仅仅传送数组在内存中的首地址,避免了复制每一个数组元素,可以节省机器的内存和运行时间。另外, 由于函数中return语句只能带回一个返回值,如果被调函数中有多个返回值,我们常常通过数组带回。但对引用传递应该 注意: 被调函数中对形参数椐的不恰当的改变,会破坏调用函数中的实参数据。
用数组作参数,本身就可以改变数组元素的值,不需要再返回数组,况且也不能返回数组,只能是指针。如果array是return在函数中,这在函数执行完后会回收array占用的地址。如果这时return指针的话,只是一个空地址。可以使用static是array成为static local variable,或者new(c++才有new和delete,c中用malloc,释放用free),这样函数完成时不会释放它占用的内存空间。
或者通过struct, 返回struct中的array。
P.S.
The C language does not let you return an array unless you either
(a) just return a pointer to the type of whatever the array is, and you have to allocate that array, eg you return an "int *".
(b) use a typedef to define the array, and then return that..
数组作为函数参数举例:
1. 顺序查找
查找是计算机中经常要遇到的一种操作,其含义是在一组数据中查找到待查数据的位置。当一组数据无序时,一般采用顺序查找。顺序查找是把给定的值与这组数据中的每个值顺序比较,如果找到,就输出这个值的位置,如果找不到则报告没有找到。下面是顺序查找的程序:
例6-24
运行该程序并输入:
Input 10 numbers:
1 2 3 4 5 6 7 8 9 0↙
Input a key you want to search:
6↙
输出结果为:
The index of the key is 5
本程序中使用了一个数组作为参数,函数seq_search中形参v没有指定数组的长度,要处理的元素的个数由其后所跟的参数n决定。
2. 把一个字符串反序后输出
例6-25
运行该程序并输入:
Input a string:abcd↙
运行结果为:
The string is reversed:dbca
这个程序中,函数reverse没有指定数组元素个数的参数,这是因为字符串总是以一个'{content}'结束,通过'{content}'就可以得到字符数组中元素的个数,也就是字符串的长度,这里我们可以看到使用字符串结束标识的好处。
二维数组也可作为函数参数,第一维的大小可以省略,而第二维的大小不能省略。下面是一个二维数组作为函数参数的例子:
例6-26
我们已经知道,数组元素要通过数组名和相应的下标一个个地引用,而数组名可以作函数的实参和形参。当数组作为函数参数时,调用函数中的实参数组只是传送该数组在内存中的首地址,即调用函数通知被调函数在内存中的什么地方找到该数组。在前面我们已经知道了函数参数的值传递方式,调用函数向被调函数传递数据地址的方式,称之为函数参数的引用传递。
对于函数参数的引用传递,除传送数组名外,调用函数还必须通知被调函数:数组有多少个元素。所以,有数组参数的函数原型的一般形式为:
类型说明符 函数名(数组参数, 数组元素个数)
数组参数并不指定数组元素的个数,即[]中是空的,没有数字。例如6-21:
我们已经知道:函数参数的引用传递不同于值传递。值传递时是把实参的值复制到形参,实参和形参占用不同的存储单元,形参值的改变不会影响到实参。而数组作为函数参数传递时,是引用传递方式,即把实参数组在内存中的首地址传给了形参,被调函数可以通过该地址,找到实参数组中的各个元素。这就意味着:在被调函数中,如果改变了形参数组某元素的值,在被调函数中,实参数组对应元素的值也会发生相应的改变。
例6-21
#include <iostream.h> int add(int x, int n) { return (x + n); } void main() { int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; int i; for( i = 0; i<10; i++) a[i]=add(a[i], i); //数组元素作函数参数 for(i = 0; i<10; i++) cout << a[i] << endl; }
例6-22
double mean(double data_array[], int numelements) { double sum = 0.0; for(int i=0; i<numelements; i++) sum += data_array[i]; return sum / numelements; }
下面我们看看应该怎样调用上面的mean函数:
例6-23
int main() { double heights[100]; double h; int n = 0; cout << "Enter heights:" << endl; cin >> h; while(h > 0.0) { heights[n] = h; n++; cin >> h; } double m = mean(heights, n); cout << "The mean is " << m << endl; return 0; }
传值调用与传址调用的区别在于,使用传值调用时,函数接收的是函数值的一份拷贝;另一方面,使用传址调用时,函数接收的是变量的内存地址。因此,函数能改变存放于指定内存单元(也就是变量值)的值,所作的改变在函数结束后继续保留下来。
函数参数的引用传递是有用的。例如当数组作函数参数时,仅仅传送数组在内存中的首地址,避免了复制每一个数组元素,可以节省机器的内存和运行时间。另外, 由于函数中return语句只能带回一个返回值,如果被调函数中有多个返回值,我们常常通过数组带回。但对引用传递应该 注意: 被调函数中对形参数椐的不恰当的改变,会破坏调用函数中的实参数据。
用数组作参数,本身就可以改变数组元素的值,不需要再返回数组,况且也不能返回数组,只能是指针。如果array是return在函数中,这在函数执行完后会回收array占用的地址。如果这时return指针的话,只是一个空地址。可以使用static是array成为static local variable,或者new(c++才有new和delete,c中用malloc,释放用free),这样函数完成时不会释放它占用的内存空间。
#include <iostream> using namespace std; int* foo() { int *arr = new int[10]; //or static int arr[10]; for (int i=0; i<10; i++) arr[i] = i; return arr; } int main(){ int *arr=0; arr = foo(); for (int i=0; i<10; i++) cout << arr[i]; delete [] arr; }
或者通过struct, 返回struct中的array。
struct mystruct { int vector[20]; } struct mystruct foo() { struct mystruct bar; ...do something nifty with bar... return bar; }
P.S.
The C language does not let you return an array unless you either
(a) just return a pointer to the type of whatever the array is, and you have to allocate that array, eg you return an "int *".
(b) use a typedef to define the array, and then return that..
typedef int array_int3[4]; array_int3 func(...) { array_int3 ret={1,2,3,4}; return ret; }
数组作为函数参数举例:
1. 顺序查找
查找是计算机中经常要遇到的一种操作,其含义是在一组数据中查找到待查数据的位置。当一组数据无序时,一般采用顺序查找。顺序查找是把给定的值与这组数据中的每个值顺序比较,如果找到,就输出这个值的位置,如果找不到则报告没有找到。下面是顺序查找的程序:
例6-24
#include <stdio.h> #define SIZE 10 //求给定值key的位置,找到则返回其下标,找不到返回-1 int seq_search(int v[],int n,int key) //v[]:数组参数 n:数组元素个数 key:待查的值 { int i; for(i = 0;i < n;i ++) if(key == v[i]) return i; return -1; //没找到 } void main(void) { int d[SIZE],KEY,i,index; printf("Input %d numbers:\n",SIZE); for(i = 0;i < SIZE;i ++) scanf("%d",&d[i]); printf("Input a key you want to search:\n"); scanf("%d",&KEY); index = seq_search(d,SIZE,KEY); if(index >= 0) printf("The index of the key is %d.\n",index); else printf("Not found.\n"); }
运行该程序并输入:
Input 10 numbers:
1 2 3 4 5 6 7 8 9 0↙
Input a key you want to search:
6↙
输出结果为:
The index of the key is 5
本程序中使用了一个数组作为参数,函数seq_search中形参v没有指定数组的长度,要处理的元素的个数由其后所跟的参数n决定。
2. 把一个字符串反序后输出
例6-25
#include <iostream.h> #include <string.h> #define LENGTH 80 //反序一个字符串 void reverse(char s[]) { char c; int i,j; j = strlen(s) - 1; for(i = 0;i < j;i ++) { c = s[i]; s[i] = s[j]; s[j] = c; j --; } } void main(void) { char str[LENGTH + 1]; cout<<"Input a string:"; cin>>str; reverse(str); cout<<"The string is reversed:"<<str<<endl; }
运行该程序并输入:
Input a string:abcd↙
运行结果为:
The string is reversed:dbca
这个程序中,函数reverse没有指定数组元素个数的参数,这是因为字符串总是以一个'{content}'结束,通过'{content}'就可以得到字符数组中元素的个数,也就是字符串的长度,这里我们可以看到使用字符串结束标识的好处。
二维数组也可作为函数参数,第一维的大小可以省略,而第二维的大小不能省略。下面是一个二维数组作为函数参数的例子:
例6-26
#include <stdio.h> void main() { void add(int x[][4], int n, int num); void print(int x[][4], int n); int a[3][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int number=10; add(a, 3, number); print(a, 3); } void add(int x[][4], int n, int num) { for(int i = 0; i<n; i++) for(int j = 0; j<4; j++) x[i][j] = x[i][j]+num; } void print(int x[][4], int n) { for(int i = 0; i<n; i++) for(int j = 0; j<4; j++) printf("%4d\n", x[i][j]); }
发表评论
-
不用库函数,自己实现strcpy和memcpy函数
2009-04-04 02:52 35271.代码实现 char* strcpy(char* strD ... -
C/C++:对指针进行操作的函数
2009-04-03 03:37 1176先看个例子 void add_array(int* a){ ... -
C语言编程常见问题解答之指针和内存分配
2009-03-30 02:51 2623指针为C语言编程提供了 ... -
详细解析C语言中的sizeof
2009-03-24 00:20 1254一、sizeof的概念 s ... -
Array vs. Malloc: A C语言问题
2009-03-16 23:57 1601code: int foo[256]; 和 int *b ... -
C/C++:函数参数传递方式
2009-03-16 20:26 3163传递变量名,传递指针 ... -
C语言中的可变参数函数 三个点“…”printf( const char* format, ...)
2009-03-16 20:17 19256第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如p ... -
C语言的三种整型数据类型:int、short int和long int
2009-03-15 20:58 104667int数据类型的位数为16位,short int数据类型的位数 ... -
C语言,结构体(struct) 用法
2009-03-15 19:52 5413结构(struct) 结构是由基本数据类型构成的、 ... -
C语言常量的定义方法
2009-03-14 23:47 2895常量是在程序运算过程中不变的量。 常量在程序中经常 ... -
typedef struct 和 typedef struct tagname 区别
2009-03-12 20:25 2548在struct, union, 和 enum 的定义中tag ... -
C语言中typedef用法
2009-03-12 19:42 65681. 基本解释 typedef为C语言的关键字,作用 ... -
i++和++i的区别
2009-03-12 01:14 1897如果有表达式 a = i++ 它等价于 a = i ; i ... -
c语言中的struct和union
2009-03-10 04:22 8654联 合(union) 1. 联合说明和联合变 ... -
ntoh16 与 hton16
2009-03-10 01:49 3186/* * Functions hton16 and ht ... -
return 1 或 return 0 的作用
2009-03-07 01:43 7974在C或C++中常有一些程序,结尾有不影响运行的 return ... -
GNU C 扩展之__attribute__ 机制简介
2009-03-04 04:44 1232GNU C的一大特色(却不 ... -
#ifdef and #ifndef
2009-03-01 01:53 1566Preprocessor: #ifdef and #ifnde ... -
c/c++中#include <>与#include""区别
2009-02-28 22:45 33179<>先去系统目录中找头文件,如果没有在到当前目录下 ... -
基本的字节序
2009-02-22 03:22 1121对于单一的字节(a byte),大部分处理器以相同的顺序处理位 ...
相关推荐
在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...
•修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { 执行语句; return 返回值; } 返回值类型:函数运行后的结果的数据类型。 参数类型:是形式参数的数据类型。 形式参数...
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参2) { 执行语句; return返回值; } 返回值类型:函数运行后的结果的数据类型。 参数类型:是形式参数的数据类型。 形式...
两个自定义的实现字符串与数组相互转换的js函数,希望能对大家有用: 代码如下:function StringToArray(str,substr) { /* 函数功能:字符串按照指定字符串分割转换为数组 参数: str :需转换的字符串 substr:分割字符...
本文介绍在自定义PowerShell函数时,如何让函数返回值,如何接收返回值,如何让不相干的内容不放到返回值数组中。 PowerShell函数体中的任何输出,一般来说,都会以返回值的形式返回给函数调用者。多个输出的内容是...
函数的参数和函数的值 一、函数的参数 前面已经介绍过,函数的参数分为形参和实参两种。 在本小节中,进一步介绍形参、实参的特点和两者的关系。 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则...
通常情况,return语句对于一个函数是很有必要的,因为往往需要函数在一系列的代码执行后会得到一个期望的返回值,而此值就是通过return语句返回,并且将控制权返回给主调函数。 语法格式: return 表达式 代码实例...
C++语言程序设计自测练习(二) 一、单项选择题 1. 函数调用不可以( )。 A.... B.... C. 作为一个函数的实参 ... 被调用函数中,如果有返回值,就一定要有return语句 D. 被调用函数中,一个return语句可返回多
数组 一维数组、数组参数、数组返回值、数组增删、扩容、排序、二维数组 chp6.面向对象 类和对象、实例变量、构造方法、方法重载、引用的概念、this关键字 chp7.面向对象三大特性 封装、继承、多态、对象创建过程、...
// 声明一个指向同样参数、返回值的函数指针变量 实例 以下实例声明了函数指针变量 p,指向函数 max: #include int max(int x, int y){ return x > y ? x : y; } int main(void){ /* p 是函数指针 */ int (* p)...
函数就是包裹在花括号中的...函数返回值 在函数中使用return语句,函数会停止执行,返回调用它的地方。 函数的返回值也不用声明类型,直接返回即可。 复制代码 代码如下: function myFunction() { var x=5;
您还将了解传递参数、返回值、局部变量和全局变量、函数原型和递归。 第 6 章:进一步了解函数 此模块继续探讨函数。它讨论了 C++ 的三个最重要的函数相关主题:引用、函数重载和默认参数。 第 7 章:更多数据类型和...
详解C语言函数返回值解析 程序一: int main() { int *p; int i; int*fun(void); p=fun(); for(i=0;i<3;i++) { printf(%d\n,*p); p++; } return 0; }; int* fun(void) { static int str[]={1,2,3,4...
1.1.17 二维数组名作为函数参数 58 1.1.18 const关键字保护数组内容 58 1.1.19 指针做为函数的返回值 58 1.1.20 指向函数的指针 59 1.1.21 把指向函数的指针做为函数的参数 60 1.1.22 memset,memcpy,memmove函数 61 ...
对PL/0作以下修改扩充: 基本内容: (1)扩充赋值运算:+= 和 -= ...(3)扩充函数:① 有返回值和返回语句;② 有参数函数。(未实现) (4)增加一维数组类型(可增加指令)。(实现) (5)其他典型语言设施。
3.2.6 void函数中的return语句 77 3.2.7 前提条件和执行结果 78 3.2.8 main函数 79 3.2.9 递归函数 79 3.3 作用域规则 80 3.3.1 局部变量 80 3.3.2 过程抽象 82 3.3.3 全局常量与全局变量 83 3.3.4 语句块 ...
// 不能使用push push 的返回值是一个数组的长度 下一次的pre就是数组的长度 并不是一个数组 // pre.indexOf is not a function出现这个错误 // indexOf这个方法名写错 // pre 没有这个方法 // 三目写法 // ...
通过JNI接口可以在Java代码中调用本地方法,并将参数和返回值传递给本地方法。在C语言中编写本地方法时,需要注意函数名、参数类型和返回值类型的定义,以及内存分配和释放的问题。在Java代码中调用本地方法时,需要...
定义函数时的参数列表,都称为 "形参(形式参数)" 2、调用语法 任意合法JS位置处 函数名(参数列表); 调用函数时,所传递的参数列表,称之为"实参(实际参数)" 3、练习 1、定义一个函数 change ,该函数中接收...