#include <stdio.h>
#include <stdlib.h>
int Print(int array[],int data)
int i;
for(i = 0;i < data;i++){
printf("%d",array[i]);
int main()
int data;
int array[3] = {1,2,3};
data = sizeof (array)/sizeof(array[0]);
Print(array,data);
system("pause");
return 0;
这样在调用Print函数时,将数组名和数组的长度都作为实际参数传递给了形式参数,在Print函数中就可以遍历数组了,在形式参数中的int array[ ]只是代表是一个数组,[ ]中有没有数字没有任何关系,一般为空。
Print(array,data)中的array相当于数组的首地址,数组名 = 数组首地址,即 Print(array,data) = Print(&array[0],data),把地址传递给Print函数的,在Print函数中给数组赋值,遍历数组,改变数组中的元素都相当于直接操作的main函数中数组的值。
在c语言中有时需要数组作为函数的参数进行传参,那么应该怎样传递呢?先看一下整数作为函数参数时的传参#include <stdio.h>#include <stdlib.h>int Add(int a,int b){ int c; c = a + b; return c;}int main(){ int a = 1; int b = 2; printf("%d",Add(a,b)); system("pause"); return 0;
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。
首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅):
[原文开始]...
可是当使用了两种方法传递数组到另一个被调函数之后,在被调函数内部可以发现sizeof拿不到数组的长度,而是单个指针变量的size。我在 main 函数中定义了一个数组,要将该数组作为参数传递给其他方法。可以当把这个数组作为参数传到另一个方法的时候,在另一个方法中无法用同样的方法计算得出数组长度。下图中:在main方法中声明了数组,可以通过sizeof计算出数组长度:20字节。注意,C语言中数组作为函数参数时,数组长度无法在被调用函数中计算,所以。在此处返回的是指针变量的size,而非数组本身的size。
柯里化 (Currying)是把接收多个参数的原函数变换成接受一个单一参数(原来函数的第一个参数的函数)并返回一个新的函数,新的函数能够接受余下的参数,并返回和原函数相同的结果。
ES6的方式实现柯里化的通用
function currying(fn,...rest1){
return function(...rest2){
//这里用apply 是为把数组形式的参数直接传入原函数 null是因为不需要改变this
return fn.apply(null,rest1.concat(rest2));
将一个sayHello函数柯里化
function sayHello(
可以定义一个能接受数组作为函数参数的函数,然后调用这个函数时,可以将一个实际的数组传递给它。
数组作为函数参数时,其定义方式有下列三种:
/*函数名param后跟一个空的[],说明param可以接受一个数组*/
void myFunction(int param[]) {
/*函数体 代码*/
/*函数名param后跟一个非空的[size],说明param可以接受一个大小为size的数...
1.sizeof(数组名),这时候计算的是整个数组的字节长度
2.&数组名,例如在32位系统中,整形数组 arr里面五个元素,输出这个数组首元素地址。末尾是00那么&arr+1 输出末尾就是4*5+4
使用python向C语言的链接库传递数组、结构体、指针类型的数据
由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来调用C语言的代码库。
至于如何调用基础数据类型的数据,请大家参考我的另外一篇文章:Python使用ctypes调用C/C++的方法
1. 使用python给C语言函数传递数组类型的参数
想必很多时候,C语言会使用数组作为参数,在之前我们使用过ctypes的一些数据类型作为C语言参数类型,包括byte、short、int、double之类的,但是在使用数组类型的时候,我们也是有着类似的做法,下面我们
1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。
2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。
3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
实现一些功能时,我们经常要进行对数组的操作。
而将这些带有对数组元素进行操作的代码封装进一个函数时,我们应该采用地址传递的传参方式,以真正地实现对数组数据的更改
(若为值传递,改变的是函数中拷贝的临时数组,并不能真正改变原来传入数组的元素)。
C++中主要有两种能实现地址传递的方法:
此处记录了使用 指针 来传递数组进函数的一些方法。(包括一维数组的两种值传递、两种地址传递,二维数组的一种值传递、一种地址传递)
尤其需要注意函数形参的语法格式
指针 * 到底从属于形参的变量类型..
在 C 语言中,数组是一种用来存储多个相同类型的数据的数据结构。要使用数组,需要先声明数组的类型和名称,然后可以通过下标来访问数组中的每一个元素。
举个例子,如果我们想声明一个存储整数的数组,可以这样写:
int numbers[10]; // 声明一个名为 numbers 的数组,它可以存储 10 个整数
如果要调用自定义函数来使用数组,可以在函数的参数列表中声明一个数组类型的参数。例如,如果我们想写一个函数来计算数组中所有元素的平均值,可以这样写:
double avg(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
return (double)sum / size;
在调用函数时,可以将数组名作为参数传递给函数,函数内部就可以使用数组来计算平均值了。例如:
double avg_value = avg(numbers, 10);
注意,在 C 语言中,数组名本身就是一个指向数组首元素的指针,因此在调用函数时可以直接将数组名传递给数组类型的参数。在函数内部,也可以使用指