❶ c語言怎麼動態創建函數
C語言可以通過宏,在你需要的位置宏展開出一個新的函數。
例如:
#define XXX(funcname) \
int funcname (int arg1, int arg2) \
{ return arg1 + arg2; }
但這也是編譯期就決定好了的,也不能實現運行期動態創建。
❷ C語言如何調用函數
C語言中,函數調用的一般形式為:
函數名(實際參數表)
對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變數或其它構造類型數據及表達式。各實參之間用逗號分隔。
#include<stdio.h>
intfun(intx,inty);//函數聲明,如果函數寫在被調用處之前,可以不用聲明
voidmain()
{
inta=1,b=2,c;
c=fun(a,b);//函數的調用,調用自定義函數fun,其中a,b為實際參數,傳遞給被調用函數的輸入值
}
//自定義函數fun
intfun(intx,inty)//函數首部
{//{}中的語言為函數體
returnx>y?x:y;//返回x和y中較大的一個數
}
(2)c語言調用動態函數擴展閱讀
C語言中不允許作嵌套的函數定義。因此各函數之間是平行的,不存在上一級函數和下一級函數的問題。但是C語言允許在一個函數的定義中出現對另一個函數的調用。
這樣就出現了函數的嵌套調用。即在被調函數中又調用其它函數。這與其它語言的子程序嵌套的情形是類似的。其關系可表示如圖。
圖表示了兩層嵌套的情形。其執行過程是:執行main函數中調用a函數的語句時,即轉去執行a函數,在a函數中調用b 函數時,又轉去執行b函數,b函數執行完畢返回a函數的斷點繼續執行,a函數執行完畢返回main函數的斷點繼續執行。
❸ C語言怎麼使用調用函數
例子代碼如下所示:
int Add(int x, int y) { int sum;
sum = x + y; return sum;
}void main() { int z;
z = Add(1, 2); printf("z=%d
", z);
}
下面分析一下 Add函數的調用過程。
首先斷點在z = Add(1, 2);處, 反匯編如下所示:
int z;
z = Add(1, 2);002C141E 6A 02 push 2 002C1420 6A 01 push 1 002C1422 E8 60 FC FF FF call 002C1087
002C1427 83 C4 08 add esp,8 002C142A 89 45 F8 mov dword ptr [ebp-8],eax
首先壓入參數1和2:
002C141E 6A 02 push 2 002C1420 6A 01 push 1
通過觀察ESP可以看到參數從右到左依次入棧,ESP往低內存方向移動8位元組:
ESP=0025FCCC
...0x0025FCAA 00 00 78 4c 33 00 bc fc 25 00 a9 fe aa 0f 78 4c 33 00 c8 fc 25 00 3d 5a b2 0f *** 01 00 00 00 02 00 00 00 ***0x0025FCCC 00 00 00 00
❹ C語言中函數調用有幾種情況
函數調用有倆種情況
1:聲明函數,然後直接在函數體內調用函數,這樣的做法是先保存當前函數執行的地址,然後查找函數指針,找到函數聲明,再找到函數實現,創建一個函數堆棧,直接在函數堆棧裡面操作,然後將返回值傳給主函數。然後通過之前保存的地址,繼續執行之後的代碼。過程比較復雜。
2:內聯函數和動態庫調用,這倆種方法的函數調用比較奇特,他們不會創建單獨的函數堆棧,而是執行到內聯函數和動態庫調用區域,直接將這部分代碼,類似於「粘貼」到主函數中,省去了保存當前代碼執行地址,等等一系列的操作,省去了很多內存空間,增加帶代碼的執行效率。適合於保存一些使用頻率很高的小代碼。能節省很多的程序運行時間。
❺ C語言中動態內存分配函數的用法及作用(比如malloc,calloc,realloc等)
先舉個例子:某用戶需要一個將任意多個整數按大小排序的程序。(在計算機文件夾中,當文件很多時經常用到排序)
1。若不用動態分配內存,那就定義一個超大的數組吧!問題是,如果用戶不需要那麼大,不就浪費了?如果定義的數組還不夠大,不就不能滿足需求了?
2。如果用動態分配,就解決上述問題了。當你需要多大內存時,就給你多大——如果有的話——這就是動態分配的意義。
現在看上述問題的代碼,我調試過的:
----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> /* calloc、exit需要聲明頭文件 */
void main()
{
int n,*p,i,j,m;
printf("本程序可對任意個整數排序;\n");
printf("請輸入整數的總個數: ");
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int)); /* calloc函數的使用 */
if(p==0) {
printf("分配失敗!\n");
exit(1); /* 當分配失敗時,exit可以終止程序 */
}
printf("請輸入這些整數:\n");
for(i=0;i<n;i++)
scanf("%d",p+i); /* 利用指針移位的方法賦值 */
for(i=1;i<n;i++) /* 冒泡排序法 */
{
for(j=0;j<n-i;j++)
if(*(p+j)>*(p+j+1))
{
m=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=m;
}
}
printf("將這些整數從小到大排列輸出為:");
for(i=0;i<n;i++)
{
if(i%5==0) printf("\n"); /* 每隔5個數換行 */
printf(" %11d;",*(p+i));
/* 為了整齊,每個數佔11個字元,當數字很多時這很重要 */
}
printf("\n");
free(p); /* 釋放空間 */
}
----------------------------------------------------------------------
調用calloc函數時,calloc(n,sizeof(int))表示請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址。(int *)表示將這個地址放在指針中。到此為止,就可以用指針來對分配到的空間操作了。注意,最後一定要用free函數釋放申請到的空間,否則這部分空間會一直占著。
malloc、calloc、realloc的用法(以上述問題為例)及區別:
1。malloc(n*sizeof(int)) /* 請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址,失敗返回0 */
2。calloc(n,sizeof(int)) /* 請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址並將每個空間賦值為0,失敗返回0 */
3。realloc(p,sizeof(int)*n) /* 給一個已經分配了地址的指針重新分配空間,參數p為原有的空間地址,sizeof(int)*n是重新申請的地址長度,用於分配不足的時候。個人覺得沒用——不夠就找到原分配處改大一點不就行了?! */
我能說得只有這些了,有些東西看起來麻煩,當你小試一下就會發現,不過如此嘛!學C要多練、多思,不怕麻煩。不知道您學了遞歸沒有?有個經典的「漢諾塔」問題,那傢伙——得整死人啊!到現在我還一知半解的……
希望我的回答對您有幫助!
❻ c語言怎麼動態調用系統時間 用以個函數做
#include <stdio.h>
#include <time.h>
void main ()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "\007The current date/time is: %s", asctime (timeinfo) );
exit(0);
}
=================
#include <time.h> -- 必須的時間函數頭文件
time_t -- 時間類型(time.h 定義)
struct tm -- 時間結構,time.h 定義如下:
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
time ( &rawtime ); -- 獲取時間,以秒計,從1970年1月一日起算,存於rawtime
localtime ( &rawtime ); -- 轉為當地時間,tm 時間結構
asctime ()-- 轉為標准ASCII時間格式:
星期 月 日 時:分:秒 年
=========================================
你要的格式可這樣輸出:
printf ( "%4d-%02d-%02d %02d:%02d:%02d\n",1900+timeinfo->tm_year, 1+timeinfo->tm_mon,
timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
就是直接列印tm,tm_year 從1900年計算,所以要加1900,
月tm_mon,從0計算,所以要加1
其它你一目瞭然啦。
❼ c語言函數調用規則
_stdcall是Pascal程序的預設調用方式,通常用於Win32 Api中,函數採用從右到左的壓棧方式,自己在退出時清空堆棧。VC將函數編譯後會在函數名前面加上下劃線前綴,在函數名後加上"@"和參數的位元組數。
_cdecl 按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對於傳送參數的內存棧是由調用者來維護的(正因為如此,實現可變參數的函數只能使用該調用約定)是C和C++程序的默認調用約定。__cdecl調用約定僅在輸出函數名前加上一個下劃線前綴,格式為_functionname。
_fastcall方式的函數採用寄存器傳遞參數,VC將函數編譯後會在函數名前面加上"@"前綴,在函數名後加上"@"和參數的位元組數。實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數,剩下的參數仍舊自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧。__fastcall調用約定在輸出函數名前加上一個「@」符號,後面也是一個「@」符號和其參數的位元組數,格式為@functionname@number。
❽ C語言如何動態調用一個函數
定義聲明一個函數 需要的時候在主函數里調用就行
❾ c語言中怎麼調用函數
函數分為庫函數和自定義函數,在調用庫函數時只要標明頭文件(所謂頭文件就是一個東西,裡麵包括了一些函數各聲明之類的,當你要調用它中的函數時就就得先向程序說明你要調用這個文件里的函數,否則有有侵權行為哦)可以在主調函數中調用這個頭文件里的所有函數了,例如頭文件為#include<stdio.h>你就可以在主調函數中調用這個頭文件里的函數:
main
{ printf("haha");/*這時main函數為主調函數,printf為被調函數*/
}
調用自定義函數時其實和調用庫函數一樣的,只不過這個函數是你自己定義的,再如:
main
{ void f();/*聲明 f()函數*/
f(); /*調用f()函數*/
}
f()
{
printf("haha");/*f()函數調用庫函數*/
}
❿ c語言中怎麼調用函數謝謝
C語言中,函數調用的一般形式為:函數名(實際參數表)對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數、變數或其它構造類型數據及表達式。各實參之間用逗號分隔。
#include<stdio.h>
int fun(int x, int y); // 函數聲明,如果函數寫在被調用處之前,可以不用聲明
void main()
{
int a=1, b=2, c;
c = fun(a, b); // 函數的調用,調用自定義函數fun,其中a,b為實際參數,傳遞給被調用函數的輸入值
}
// 自定義函數fun
int fun(int x, int y) // 函數首部
{ // {}中的語言為函數體
return x>y ? x : y; // 返回x和y中較大的一個數
}
函數實參
函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。例如: printf("%d",max(x,y)); 即是把max調用的返回值又作為printf函數的實參來使用的。在函數調用中還應該注意的一個問題是求值順序的問題。
所謂求值順序是指對實參表中各量是自左至右使用呢,還是自右至左使用。對此,各系統的規定不一定相同。介紹printf 函數時已提到過,這里從函數調用的角度再強調一下。
以上內容參考:網路-函數調用