c語言函數數組
① 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語言函數怎麼調用數組部分
一、數組可定義為全局變數,函數直接調用。
二、數組可定義為局部變數,再通過參數傳遞到函數中調用(實參傳數組名,表示數組首地址,也可通過指針或數組名+數字來傳遞數組局部地址)。
三、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璇璦瀹氫箟涓涓鐢ㄤ簬杈撳叆鏁存暟鏁扮粍鍏冪礌鐨勫嚱鏁幫紵
瑕佸畾涔変竴涓鐢ㄤ簬杈撳叆鏁存暟鏁扮粍鍏冪礌鐨勫嚱鏁幫紝鎮ㄥ彲浠ヤ嬌鐢ㄤ互涓婥璇璦浠g爜錛
鍦ㄤ笂榪頒唬鐮佷腑錛屾垜浠瀹氫箟浜嗕竴涓鍚嶄負input_array鐨勫嚱鏁幫紝璇ュ嚱鏁版帴鍙椾袱涓鍙傛暟錛氫竴涓鏁存暟鏁扮粍arr鍜屼竴涓鏁存暟n錛岃〃紺烘暟緇勭殑闀垮害銆傚嚱鏁頒嬌鐢╢or寰鐜榪浠f暟緇勪腑鐨勬瘡涓鍏冪礌錛屽苟浣跨敤scanf鍑芥暟浠庣敤鎴瘋緭鍏ヤ腑璇誨彇涓涓鏁存暟錛屽苟灝嗗叾瀛樺偍鍒板綋鍓嶅厓緔犱腑銆
鍦╩ain鍑芥暟涓錛屾垜浠澹版槑涓涓闀垮害涓10鐨勬暣鏁版暟緇刟rr錛屽苟浣跨敤input_array鍑芥暟杈撳叆鏁扮粍鍏冪礌銆傛偍鍙浠ュ皢鏁扮粍闀垮害鍜屾暟緇勫彉閲忓悕鏇存敼涓烘偍闇瑕佺殑鍊箋
璇鋒敞鎰忥紝涓婅堪浠g爜涓鐨勮緭鍏ユ柟娉曟槸綆鍗曠殑紺轟緥浠g爜錛屽苟涓斾笉鍏鋒湁鍋ュ.鎬с傚湪瀹為檯緙栫▼涓錛屾偍闇瑕佽冭檻鍚勭嶈緭鍏ユ儏鍐碉紝渚嬪傝緭鍏ュ間笉鏄鏁存暟絳夛紝浠ラ伩鍏嶆綔鍦ㄧ殑閿欒銆
④ 請問在C語言中,函數傳參時怎樣利用指針傳遞數組
數組名就是指針,例如:
#include <stdio.h>
voidpr(char *p)
{
printf(p);
}
void main(void)
{
char s[] = "abc";
pr(s);
}
(4)c語言函數數組擴展閱讀:
注意事項
非數組類的聲明盡量以指針的方式進行比較好。倘若一個指針指向的內存並不是一個數組,那麼採用數組名的聲明方式或許就會給人產生錯誤的引導。類似的,如果指向的是一個數組區域,則會給人以更加豐富的信息。例如:
int main(int argc,char* argv[])
{
/* code here */
}
與
int main(int argc,char** argv)
{
/* code here */
}
兩種方式完全等價,但是前面一種能夠更清晰地看出:這個參數是指向某個元素起始地址的指針,而後面的這種方式則不能夠直觀地看出這種含義。
⑤ C語言編寫函數求數組中最小值
可以參考下面的代碼:
int findMin(int szIn[], int size)
{
int tmpMin = szIn[0];
for(int i = 0; i < size; ++i)
{
if(tmpMin <= szIn[i])
{
tmpMin = szIn[i];
}
}
return tmpMin;
}
(5)c語言函數數組擴展閱讀:
C語言isupper()函數:判斷一個字元是否是大寫字母
C語言isspace()函數:判斷一個字元是否是空白符
C語言isprint()函數:判斷一個字元是否是可列印字元
C語言islower()函數:判斷一個字元是否是小寫字母
C語言ldexp()函數:返回x乘以2的exponent次方(次冪)的值
int isdigit(int ch) 若ch是數字('0'-'9')返回非0值,否則返回0
⑥ c語言中調用函數的返回值,如果是數組,主函數要輸出這個數組怎麼實現啊
用指針,另外保存數據的變數退出函數時不得消失。
例如:
#include<stdio.h>
int * fun(int n)
{
int i;
static int a[100]; // 這里用static
for (i=0;i<n;i++) a[i]=i;
return &a[0];
}
void main()
{
int i,n=5;
int *p; // 聲明指針
p = fun(n); // 返回指針
for (i=0;i<n;i++) printf("%d ",p[i]); // 把 p 看成數組來輸出
}
得 0 1 2 3 4
(6)c語言函數數組擴展閱讀:
注意事項
1、數組宏棚的維度必須是一個常蔽段則量表達式
int main(void)
{
constexpr int i = 20;
int j = 5;//不是常量表達式
int arr1[i];//正確
int arr2[j];//錯誤
system("燃宏pause");
return 0;
}
2、默認情況下,數組的元素被默認初始化。
而且需要注意的是,和內置類型的變數一樣,如果在函數內部定義了某種內置類型的數組,那麼默認初始化會令數組有未定義的值。