當前位置:首頁 » 編程語言 » c語言中函數數組
擴展閱讀
怎麼清除預覽圖片的緩存 2022-11-30 14:15:11
c語言創建有序鏈表 2022-11-30 14:08:06

c語言中函數數組

發布時間: 2022-09-25 11:36:54

c語言中能不能定義函數數組

函數不可以定義為數組,可以用函數指針來操作。
1.函數指針的數組定義方法:返回值類型( * 指針變數名[Number]) (形參列表)。例如:double add(double a,double b){};double sub(double a,double b){};double mul(double a,double b){};double div1(double a,double b){};double (*oper_func[])(double, double) = {add,sub,mul,div1};//函數指針的數組定義2.函數指針是指向函數的指針變數。 因而「函數指針」本身首先應是指針變數,只不過該指針變數指向函數。這正如用指針變數可指向整型變數、字元型、數組一樣,這里是指向函數。C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變數後,可用該指針變數調用函數,就如同用指針變數可引用其他類型變數一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數。3.函數指針的聲明方法為:返回值類型( * 指針變數名) (形參列表);「返回值類型」說明函數的返回類型,「( * 指針變數名)」中的括弧不能省,括弧改變了運算符的優先順序。若省略整體則成為一個函數說明,說明了一個返回的數據類型是指針的函數,後面的「形參列表」表示指針變數指向的函數所帶的參數列表。例如:int func(int x); /* 聲明一個函數 */int (*f) (int x); /* 聲明一個函數指針 */f = func; /* 將func函數的首地址賦給指針f */或者使用下面的方法將函數地址賦給函數指針:f = &func;賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。例子:
#include<stdio.h>int max(int x,int y){return (x>y? x:y);}int main(){ int (*ptr)(int, int); int a, b, c; ptr = max; scanf("%d%d", &a, &b); c = (*ptr)(a,b); printf("a=%d, b=%d, max=%d", a, b, c); return 0;}

Ⅱ c語言函數返回數組


在C語言中,無法直接返回一個數組,但是可以通過返回對應類型指針的方式,返回數組。

在大多數情況下,一維數組和一維指針是可以通用的。


比如,定義一個函數,申請一定長度的整型動態數組,其長度用參數傳入,並將結果返回。如出錯,返回空指針NULL。 代碼可以寫成如下形式:

int*int_array_create(intn)//參數n為數組元素個數
{
int*r;
if(n<=0)returnNULL;//參數錯誤
r=(int*)malloc(sizeof(int)*n);//申請內存空間,大小為n個int長度。
returnr;//返回得到的整型數組的指針。
}

Ⅲ c語言中函數能返回一個數組嗎

不能直接返回一個數組,但是可以用其他方式實現類似功能。
方法1:利用全局變數

分析:全局變數作為C語言的一個知識點,雖然我們都了解它的特點,但在實際教學過程中應用得並不是很多。由於全局變數的作用域是從定義變數開始直到程序結束,而對於編寫有多個返回值的C語言函數,我們可以考慮把要返回的多個值定義成全局變數。當函數被調用時,全局變數被更改,我們再把更改後的全局變數值應用於主調函數中。函數被調用後被更改後的全局變數值即為函數的數個返回值。下面以一個實例演示該方法的應用。
實例1:編寫函數求3個數中的最大值與最小值。
方法:把最大值、最小值分別定義成2個全局變數max、min,在用戶自定義函數中把求出來的最大值與最小值分別賦給全局變數max、min。函數調用完畢後全局變數的max、min值即保存了函數要求返回的值。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
int max,min;/*定義兩個全局變數用於保存函數返回值*/
void max_min(int a,int b,int c) /*定義求最大最小值的函數*/
{max=min=a; /*初始化最大最小值*/
if(max if(max if(min>b)min=b;
if(min>c)min=c;
}
main()
{int x,y,z;
printf(" 請輸入3個整數:\n");
scanf("%d,%d,%d",&x,&y,&z);
max_min(x,y,z) ;/*調用求最大值與最小值的函數*/
printf("三個數中的最大值為:%d;最小值為:%d",max,min);/*輸出最大值與最小值*/
getch();
}
調試結果如下:
請輸入3個整數:
5,-6,2
三個數中的最大值為:5;最小值為:-6
注意:該方法雖然可以實現有多個返回值的函數,但由於全局變數不能保證值的正確性(因為其作用域是全局,所以程序范圍內都可以修改它的值,如果出現錯誤將非常難以發現),並且全局變數增加了程序間模塊的耦合,所以該方法要慎用。

方法2:傳遞數組指針

分析:在教學過程中,我們知道C語言函數參數的傳遞方式有值傳遞與地址傳遞。當進行值傳遞時,主調函數把實參的值復制給形參,形參獲得從主調函數傳遞過來的值運行函數。在值傳遞過程中被調函數參數值的更改不能導致實參值的更改。而如果是地址傳遞,由於傳遞過程中從實參傳遞過來的是地址,所以被調函數中形參值的更改會直接導致實參值的更改。因此,我們可以考慮把多個返回值作為數組元素定義成一個數組的形式,並使該數組的地址作為函數的形式參數,以傳址方式傳遞數組參數。函數被調用後,形參數組元素改變導致實參改變,我們再從改變後的實參數組元素中獲得函數的多個返回值。以下實例演示該方法的應用。
實例2:編寫函數求一維整形數組的最大值與最小值,並把最大值與最小值返回給主調函數。
方法:以指針方式傳遞該一維數組的地址,然後把數組的最大值與數組的第一個元素交換,把數組的最小值與最後一個元素交換。函數被調用完畢後,實參數組中的第一元素為數組的最大值,實參數組中最後一個元素為數組的最小值,從而實現返回數組的最大值與最小值的功能。程序參考代碼如下:
#include "stdio.h"
#include "conio.h"
void max_min(int *ptr,int n) /*定義求數組最大值最小值的函數,傳遞數組指針*/
{int i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int *temp;/*用於交換位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr<*(ptr+i))/*最大值與第一個元素進行交換*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp ;
}
if(*(ptr+n-1)>*(ptr+i))/*最小值與最後一個元素進行交換*/
{
j=i;
*temp =*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)= *temp ;}
}
}
/*調用最大最小值函數*/
main()
{
int A[6],i;
for(i=0;i<6;i++)
scanf("%d",&A[i]);
max_min(A,6);
printf("max=%d, min=%d\n \n",A[0],A[5]);
getch();
}
調試結果如下:
請輸入6個整形數,以空格隔開:
5 8 9 32 -6 4
max=32,min=-6
注意:該方法適用於多個返回值的數據類型一致的情況。當返回值數據類型不一致時,不適用該方法

Ⅳ c語言數組與函數

給你看一下我的代碼
#include<stdio.h>
void main(){
int a[10],b[10],i,j,temp;
for(i=0;i<10;i++){
printf("請輸入第%d個數:",(i+1));
scanf("%d",&a[i]);
//保存數組,因為輸入完數組要冒泡排序,排序後的元素順序可能和原數組不一樣
b[i]=a[i];
}
//冒泡排序,求最大值
for(i=0;i<9;i++){
for(j=0;j<9-i;j++){
if(a[j]<a[j+1]){ //這里控制的升序還是降序,我這是降序
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
//查找最大值在原數組的位置
for(i=0;i<10;i++){
if(b[i]==a[0]){ //降序的話最大值是a[0],升序的話最大值是a[9]
break; //一旦找到最大值,馬上跳出循環
}
}
printf("最大值是%d,它在原數組中是第%d個元素!\n",a[0],(i+1));
}

Ⅳ C語言定義一個函數如果含有數組

void min(int a[],int x) //int x是用來標記傳過來的數組的長度(即a數組指向的那個數組的長度)。

因為你在函數中計算的時候,a只能當做一個指針來用,沒有具體的長度,而且你是int 型的,所以沒有標准庫函數來求你需要計算的數組的長度,所以你就沒法計算。

void min(int a[],int b[])這樣計算沒錯誤,但是在計算的時候,你要知道a所指向的數組的長度和b所指向的長度,例如下面的例子:

a數組中有10個數,b數組中有2個數,a數組的大小是40個位元組,而指向他的c數組大小隻有4個位元組,所以當你運算的時候,你要知道c指向的a數組的大小,同理,d也是一樣。

#include"stdio.h"
#include"string.h"
void min(int c[],int d[])
{
int i,j=0;
int e[100]={0};
printf("c=%d ",sizeof(c));
for(i=0;i<10;i++)//a數組中有10個數
e[j++]=c[i];
for(i=0;i<2;i++)//b數組中有2個數
e[j++]=d[i];
for(i=0;e[i];i++)
printf("%d ",e[i]);
}
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[2]={3,4};
printf("a=%d ",sizeof(a));
min(a,b);
}

Ⅵ C語言,在函數里要輸入一個數組怎麼辦

用指針就可以了,如
定義有int a[5];
則這樣定義函數:
int fun(int *p, int size)
{
//p為數組的首地址
//size為數組的大小
//傳遞進去後可以像操作a一樣用下標操作p
//如p[0], p[4]...
}
傳遞參數給函數可以這樣寫:
fun(a, 5);

若是多維數組,則第一維大小不給出,只指定後面的維數大小,如:
定義有int a[5][2];
則這樣定義函數:
int fun(int p[][2], int size)
{
//p為數組的首地址
//size為第一維的大小
//傳遞進去後可以像操作a一樣用下標操作p
//如p[0][1], p[4][1]...
}
傳遞參數給函數可以這樣寫:
fun(a, 5);

Ⅶ c語言函數怎麼調用數組部分

一、數組可定義為全局變數,函數直接調用。

二、數組可定義為局部變數,再通過參數傳遞到函數中調用(實參傳數組名,表示數組首地址,也可通過指針或數組名+數字來傳遞數組局部地址)。

三、main函數想要調用函數返回的數組可用static定義靜態變數或malloc定義動態數組(字元串常量也可返回使用,但局部變數,在函數調用結束會被釋放,不能作為返回地址使用)。

下面是演示代碼:

#include <stdio.h>

#include <string.h>

#include <malloc.h>

char str1[]="我是全局變數數組";

char *fun0(char str2[]);

char *fun1();

char *fun2();

int main()

{

char *str3=NULL,*str4=NULL,*str5=NULL;

char str2[]="我是main函數的局部數組變數";

str3=fun0(str2);

printf("str3:%s,fun函數調用結束,我的地址依然可以使用 ",str3);

str4=fun1();

printf("str4:%s,fun函數調用結束,我的地址依然可以使用 ",str4);

str5=fun2();

printf("str5:%s,fun函數調用結束,函數結束不會自動釋放 ",str5);

free(str5);

return 0;

}

char *fun0(char s[])

{

static char str3[]="我是fun函數申明的靜態數組變數";

printf("str1:%s,fun函數可以直接調用 ",str1);

printf("str2:%s,fun函數通過參數將我的地址傳進來 ",s);

return str3;

}

char *fun1()

{

char *str4="我是fun1函數的字元串常量";

return str4;

}

char *fun2()

{

int len;

char sTemp[]="這是一個臨時數組,之後用於給mallc申請的地址傳值,傳遞內容為:(我是fun函數通過mallic申請的數組)";

char *str5=NULL;

len=strlen(sTemp+63);

str5=(char *)malloc(sizeof(char)*len+1);

if(!str5)return NULL;

strcpy(str5,sTemp+63);

str5[len-2]=0;

return str5;

}

Ⅷ 在C語言中如何使函數返回數組

C/C++不能直接返回一個數組。這是由於在C/C++中,數組不是一種類型,因此不能被直接返回。 在C/C++中,一般有兩種方法來返回一個數組。 第一種方法: 返回一個指向數組的指針,例如char (*retArray)[10]聲明了一個函數retArray,該函數可以返回指向具有10個char元素的數組例子如下:#include#includeint (*retArray())[10]{int (*a)[10];int i=0;/*動態開辟空間*/ a=calloc(10,sizeof(int));/*賦值*/for(i=0;i<10;i++){(*a)[i]=i;}return a;}int main(){int (*b)[10]; /*函數返回指向數組的指針*/ b=retArray(); /*列印第一個元素*/ printf("%d/n",(*b)[0]); /*釋放空間*/free(b);return 0;}第二種方法: 如果你不喜歡用指針的形式返回數組,那麼可以採用返回一個結構的形式。這種形式相對較安全,可以避免忘記釋放指針而造成內存泄露,也可以避免訪問懸掛指針造成的錯誤。但缺點是由於結構是先拷貝再返回,因此如果結構較大時,會影響效率和佔用較大內存。 例子如下:#includestruct tag{int a[10];}x,y;struct tag retArray(){int i=0;for(i=0;i<10;i++) x.a[i]=i;return x;}int main(){struct tag y=retArray(); printf("%d/n",y.a[3]);return 0;}注意:(1)在返回指針時要切記要避免內存泄露和訪問懸掛指針。 (2)很多人認為指針和數組等價的,這是錯誤的。int (*a)[10]和int b[10]兩者是不能直接用a=b來賦值的。在數組和指針作為函數參數傳遞時,二者可以認為等價,這是因為數組會被轉化為指針來傳遞。 (3)返回多維數組方法類似。

Ⅸ C語言中自定義的函數中有數組,應該如何運用該函數

方法
有2
將該數組定義為全局變數,即:
int
g_arr;
void
fun()
{...}
void
main()
{...}
2.將該數組作為函數參數傳遞到自定義函數里,即:
void
fun(int
arr[])
{...}
void
main()
{
int
arr[10];
fun(arr);
}

Ⅹ C語言中的數組什麼意思

所謂數組,是有序的元素序列。數組是在程序設計中,為了處理方便, 把具有相同類型的若干元素按無序的形式組織起來的一種形式。這些無序排列的同類數據元素的集合稱為數組。

比如油煙機的風扇轉速會和工作的模式之間有一定的關系,那麼我們就可以把它的工作模式和一維數組的下標對應起來,我們將具體的轉速放在數組中,這樣的話就非常方便我們在日後查詢。

再比如說家中的冷暖燈光控制這方面,色溫燈里會有兩個燈珠,分別對應的是冷光和暖光,選擇不同的模式燈光的顏色就不同,我們就可以將這兩種燈光的亮度pwm值事先放在二維數組中,以便調用調光。

在程序中合理地使用數組,會使程序的結構比較整齊,而且可以把較為復雜的運算,轉化成簡單的數組來表示。

(10)c語言中函數數組擴展閱讀:

一、使用規則:

1、可以只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。

2、只能給元素逐個賦值,不能給數組整體賦值。

(請注意:在C、C#語言中是這樣,但並非在所有涉及數組的地方都這樣,資料庫是從1開始。)

3、若不給可初始化的數組賦初值,則全部元素均為0值。

4、假如給全部元素賦值,則在數組說明中, 可以不給出數組元素的個數。

動態賦值可以在程序執行過程中,對數組作動態賦值。這時可用循環語句配合scanf函數逐個對數組元素賦值。

二、表示方法:

數組元素是組成數組的基本單元。

數組元素也是一種變數, 其標識方法為數組名後跟一個下標。下標表示了元素在數組中的順序號。數組元素的一般形式為:數組名[下標] 其中的下標只能為整型常量或整型表達式。

如為小數時,C編譯將自動取整。例如,a[5],a[i+j],a[i++]都是合法的數組元素。數組元素通常也稱為下標變數。必須先定義數組, 才能使用下標變數。在C語言中只能逐個地使用下標變數, 而不能一次引用整個數組。