- 浏览: 895542 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (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 35781.代码实现 char* strcpy(char* strD ... -
C/C++:对指针进行操作的函数
2009-04-03 03:37 1214先看个例子 void add_array(int* a){ ... -
C语言编程常见问题解答之指针和内存分配
2009-03-30 02:51 2655指针为C语言编程提供了 ... -
详细解析C语言中的sizeof
2009-03-24 00:20 1292一、sizeof的概念 s ... -
Array vs. Malloc: A C语言问题
2009-03-16 23:57 1640code: int foo[256]; 和 int *b ... -
C/C++:函数参数传递方式
2009-03-16 20:26 3202传递变量名,传递指针 ... -
C语言中的可变参数函数 三个点“…”printf( const char* format, ...)
2009-03-16 20:17 19350第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如p ... -
C语言的三种整型数据类型:int、short int和long int
2009-03-15 20:58 104784int数据类型的位数为16位,short int数据类型的位数 ... -
C语言,结构体(struct) 用法
2009-03-15 19:52 5519结构(struct) 结构是由基本数据类型构成的、 ... -
C语言常量的定义方法
2009-03-14 23:47 2970常量是在程序运算过程中不变的量。 常量在程序中经常 ... -
typedef struct 和 typedef struct tagname 区别
2009-03-12 20:25 2587在struct, union, 和 enum 的定义中tag ... -
C语言中typedef用法
2009-03-12 19:42 66961. 基本解释 typedef为C语言的关键字,作用 ... -
i++和++i的区别
2009-03-12 01:14 1939如果有表达式 a = i++ 它等价于 a = i ; i ... -
c语言中的struct和union
2009-03-10 04:22 8732联 合(union) 1. 联合说明和联合变 ... -
ntoh16 与 hton16
2009-03-10 01:49 3248/* * Functions hton16 and ht ... -
return 1 或 return 0 的作用
2009-03-07 01:43 8025在C或C++中常有一些程序,结尾有不影响运行的 return ... -
GNU C 扩展之__attribute__ 机制简介
2009-03-04 04:44 1267GNU C的一大特色(却不 ... -
#ifdef and #ifndef
2009-03-01 01:53 1614Preprocessor: #ifdef and #ifnde ... -
c/c++中#include <>与#include""区别
2009-02-28 22:45 33268<>先去系统目录中找头文件,如果没有在到当前目录下 ... -
基本的字节序
2009-02-22 03:22 1157对于单一的字节(a byte),大部分处理器以相同的顺序处理位 ...
相关推荐
在C语言中,数组是一种非常重要的数据结构,用于存储同类型的数据集合。...总结起来,C语言中数组在函数中的使用主要包括作为参数传递和通过返回指针来间接返回数组。理解这些概念对于编写高效的C语言程序至关重要。
本教程将详细阐述如何在C++中创建一个模糊控制DLL,并在WinCC中正确调用该DLL,特别是涉及自定义返回数组函数的书写规则。 首先,我们需要了解DLL的基本概念。DLL是一种共享库,它可以包含执行代码和资源,多个程序...
保持接口清晰• 使用函数指针和高阶函数实现模块化和可扩展性• 注意函数返回值的处理,特别是在异步编程中确保正确处理返回结果第 22 页 / 共 33 页学习建议• 理解并掌握各种参数类型和传递方式的原理及区别•...
在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...
4. **函数指针与数组**:C++允许我们使用函数指针,这样可以将函数作为参数传递,或者将数组作为函数的返回值。结合数组和函数指针,可以实现动态策略或回调机制。 5. **递归函数与数组**:在某些情况下,可以使用...
然而,C语言中处理数组的方式与许多其他高级语言不同,特别是在作为函数参数和返回值时。本篇文章将深入探讨如何在C语言中使用数组作为函数参数以及返回值。 一、数组作为形参 在C语言中,当你尝试将数组作为函数...
pointer to function of parameter is void and return value is int (指向一个函数的指针,这个函数参数为空,返回值为整数) 2. 指针所指物的类型是什么? 很简单,指针本身的类型去掉 “*” 号就可以了,分别...
9. 函数返回值:函数可以返回一个值,也可以什么值也不返回。如果函数中没有return语句,将返回一个不确定的值。 10. 静态变量的初值:静态变量的初值可以是随机值,也可以是零。静态变量的初值在程序的生命周期内...
第二种方法是使用结构体来包装数组,然后将整个结构体作为函数的返回值。这种方法相比于直接返回数组指针更为安全,因为结构体可以包含更多的数据成员,且不需要担心内存释放的问题。 下面是具体示例: ```c #...
1. 函数定义:Swift中的函数定义使用`func`关键字,后面跟着函数名、参数列表(如果有)和返回类型(如果函数有返回值)。例如,一个简单的函数定义可能如下所示: ```swift func addNumbers(number1: Int, number...
•修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...) { 执行语句; return 返回值; } 返回值类型:函数运行后的结果的数据类型。 参数类型:是形式参数的数据类型。 形式参数...
`return_type` 是函数返回值的类型,`function_name` 是函数的名字,`parameters` 是传递给函数的变量列表。 **7.3 调用函数** 调用函数是在代码中使用函数的地方,通过函数名和括号内的参数列表来完成。例如: ```...
总结起来,在C语言中,参数传递方式和函数返回值是紧密相关的。参数值传递方式简单、安全,适用于不需要修改实参值的场景,但无法实现函数内部对实参的修改;而参数地址传递方式则可以实现实参值的修改,使得函数...
指针还可以用于函数返回值,返回多个值或者复杂数据结构。 在压缩包内的源码文件(114.1.c、114.2.c、114.3.c)中,我们可以预期看到这些概念的实际应用。例如,114.1.c可能是关于函数的示例,114.2.c可能涉及数组...
通常,DLL函数接收`LPVOID`类型的参数,然后根据数组长度和类型进行解包处理。 通过以上步骤,你可以在易语言源码中成功向DLL传递数组参数。实践中可能遇到更多细节问题,如数据类型转换、DLL加载路径等问题,都...
- 此例中,`a`函数接受一个整型参数和一个浮点型参数。 - 实际参数`num1`和`num2`分别对应形式参数`num1_back`和`num2_back`。 **标识符的作用域** - 在不同函数中使用相同名称的变量不会导致冲突,因为它们的...
数组作为函数参数需要注意数组的维度和元素类型。 内部函数与外部函数 内部函数是指在函数内部定义的函数。外部函数是指在函数外部定义的函数。内部函数和外部函数可以同时存在,但它们的作用域不同。 变量的动态...