c語言子函數參數
㈠ c語言函數的參數的問題
主函數也就是main函數 一般是沒有參數的。函數可以分為兩類,帶參數和不帶參數的,參數的作用就是值傳遞。一般都是在主函數中調用子函數,由實參傳遞給形參,形參:全稱為「形式參數」是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳遞的參數。 形參的作用是實現主調函數與被調函數之間的聯系,通常將函數所處理的數據,影響函數功能的因素或者函數處理的結果作為形參。沒有形參的函數在形參表的位置應該寫void.main 函數也可以有形參和返回值,其形參也稱為命令行參數,由操作系統在啟動程序時初始化,其返回值傳遞給操作系統。
形參和實參的特點
1、形參變數只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參有在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數。 2、實參可以是常量、變數、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值。 3、實參和形參在數量上,類型上、順序上應嚴格一致,否則就會發生類型不匹配的錯誤。 4、函數調用中發生的數據傳送是單向的,即只能把實參傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數調用過程中,形參值發生改變,而實參中的值不會變化。
㈡ 在C語言中怎麼將子函數中的數組和函數調用出來
來傳送子函數中的數組有多種方法——可以通過函數返回值返回地址傳遞數組;也可以通過函數輸入參數來傳遞數組;還可以通過全局變數來傳遞數組。
子函數本身可以直接在作用域中進行調用。
1、通過函數返回值返回地址傳遞數組。
聲明函數時需要聲明函數返回值類型為對應數組的地址,此時可以返回數組的地址,結合數組元素的地址關系可以傳遞整個數組,同時可以根據數組的特性傳遞多個參數。
注意:子函數是C語言模塊化編程思想的核心,其方法是通過輸入介面和輸出介面實現對黑盒的調用,故對其內部數據的輸入和調用也需要通過輸入介面、輸出介面和程序的公共區域實現。
㈢ C語言中寫子函數時候怎麼確定子函數類型
函數定義的一般形式 1.無參函數的一般形式 類型說明符 函數名() { 類型說明 語句 } 其中類型說明符和函數名稱為函數頭。 類型說明符指明了本函數的類型,函數的類型實際上是函數返回值的類型。 該類型說明符與第二章介紹的各種說明符相同。 函數名是由用戶定義的標識符,函數名後有一個空括弧,其中無參數,但括弧不可少。{} 中的內容稱為函數體。在函數體中也有類型說明, 這是對函數體內部所用到的變數的類型說明。在很多情況下都不要求無參函數有返回值, 此時函數類型符可以寫為void。 我們可以改為一個函數定義: void Hello() { printf ("Hello,world \n"); } 這里,只把main改為Hello作為函數名,其餘不變。Hello 函數是一個無參函數,當被其它函數調用時,輸出Hello world字元串。 2.有參函數的一般形式 類型說明符 函數名(形式參數表) 型式參數類型說明 { 類型說明 語句 } 有參函數比無參函數多了兩個內容,其一是形式參數表, 其二是形式參數類型說明。在形參表中給出的參數稱為形式參數, 它們可以是各種類型的變數, 各參數之間用逗號間隔。在進行函數調用時,主調函數將賦予這些形式參數實際的值。 形參既然是變數,當然必須給以類型說明。例如,定義一個函數, 用於求兩個數中的大數,可寫為: int max(a,b) int a,b; { if (a>b) return a; else return b; } 第一行說明max函數是一個整型函數,其返回的函數值是一個整數。形參為a,b。第二行說明a,b均為整型量。 a,b 的具體值是由主調函數在調用時傳送過來的。在{}中的函數體內, 除形參外沒有使用其它變數,因此只有語句而沒有變數類型說明。 上邊這種定義方法稱為「傳統格式」。 這種格式不易於編譯系統檢查,從而會引起一些非常細微而且難於跟蹤的錯誤。ANSI C 的新標准中把對形參的類型說明合並到形參表中,稱為「現代格式」。 例如max函數用現代格式可定義為: int max(int a,int b) { if(a>b) return a; else return b; } 現代格式在函數定義和函數說明(後面將要介紹)時, 給出了形式參數及其類型,在編譯時易於對它們進行查錯, 從而保證了函數說明和定義的一致性。例1.3即採用了這種現代格式。 在max函數體中的return語句是把a(或b)的值作為函數的值返回給主調函數。有返回值函數中至少應有一個return語句。 在C程序中,一個函數的定義可以放在任意位置, 既可放在主函數main之前,也可放在main之後。例如例1.3中定義了一個max 函數,其位置在main之後, 也可以把它放在main之前。 修改後的程序如下所示。 int max(int a,int b) { if(a>b)return a; else return b; } void main() { int max(int a,int b); int x,y,z; printf("input two numbers:\n"); scanf("%d%d",&x,&y); z=max(x,y); printf("maxmum=%d",z); } 現在我們可以從函數定義、 函數說明及函數調用的角度來分析整個程序,從中進一步了解函數的各種特點。程序的第1行至第5行為max函數定義。進入主函數後,因為准備調用max函數,故先對max函數進行說明(程序第8行)。函數定義和函數說明並不是一回事,在後面還要專門討論。 可以看出函數說明與函數定義中的函數頭部分相同,但是末尾要加分號。程序第12 行為調用max函數,並把x,y中的值傳送給max的形參a,b。max函數執行的 結果 (a或b)將返回給變數z。最後由主函數輸出z的值。 函數調用的一般形式前面已經說過,在程序中是通過對函數的調用來執行函數體的,其過程與其它語言的子程序調用相似。C語言中, 函數調用的一般形式為: 函數名(實際參數表) 對無參函數調用時則無實際參數表。 實際參數表中的參數可以是常數,變數或其它構造類型數據及表達式。 各實參之間用逗號分隔。'Next of Page在C語言中,可以用以下幾種方式調用函數: 1.函數表達式 函數作表達式中的一項出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。例如: z=max(x,y)是一個賦值表達式,把max的返回值賦予變數z。'Next of Page 2.函數語句 函數調用的一般形式加上分號即構成函數語句。例如: printf ("%D",a);scanf ("%d",&b);都是以函數語句的方式調用函數。 3.函數實參 函數作為另一個函數調用的實際參數出現。 這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。例如: printf("%d",max(x,y)); 即是把max調用的返回值又作為printf函數的實參來使用的。在函數調用中還應該注意的一個問題是求值順序的問題。 所謂求值順序是指對實參表中各量是自左至右使用呢,還是自右至左使用。 對此, 各系統的規定不一定相同。在3.1.3節介紹printf 函數時已提 到過,這里從函數調用的角度再強調一下。 看例5.2程序。 void main() { int i=8; printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--); } 如按照從右至左的順序求值。例5.2的運行結果應為: 8 7 7 8 如對printf語句中的++i,--i,i++,i--從左至右求值,結果應為: 9 8 8 9 應特別注意的是,無論是從左至右求值, 還是自右至左求值,其輸出順序都是不變的, 即輸出順序總是和實參表中實參的順序相同。由於Turbo C現定是自右至左求值,所以結果為8,7,7,8。上述問題如還不理解,上機一試就明白了。函數的參數和函數的值 一、函數的參數 前面已經介紹過,函數的參數分為形參和實參兩種。 在本小節中,進一步介紹形參、實參的特點和兩者的關系。 形參出現在函數定義中,在整個函數體內都可以使用, 離開該函數則不能使用。實參出現在主調函數中,進入被調函數後,實參變數也不能使用。 形參和實參的功能是作數據傳送。發生函數調用時, 主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送。 函數的形參和實參具有以下特點: 1.形參變數只有在被調用時才分配內存單元,在調用結束時, 即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。 函數調用結束返回主調函數後則不能再使用該形參變數。 2.實參可以是常量、變數、表達式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。 3.實參和形參在數量上,類型上,順序上應嚴格一致, 否則會發生「類型不匹配」的錯誤。 4.函數調用中發生的數據傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數調用過程中,形參的值發生改變,而實參中的值不會變化。例5.3可以說明這個問題。 void main() { int n; printf("input number\n"); scanf("%d",&n); s(n); printf("n=%d\n",n); } int s(int n) { int i; for(i=n-1;i>=1;i--) n=n+i; printf("n=%d\n",n); } 本程序中定義了一個函數s,該函數的功能是求∑ni=1i 的值。在主函數中輸入n值,並作為實參,在調用時傳送給s 函數的形參量n( 注意,本例的形參變數和實參變數的標識符都為n, 但這是兩個不同的量,各自的作用域不同)。 在主函數中用printf 語句輸出一次n值,這個n值是實參n的值。在函數s中也用printf 語句輸出了一次n值,這個n值是形參最後取得的n值0。從運行情況看,輸入n值為100。即實參n的值為100。把此值傳給函數s時,形參 n 的初值也為100,在執行函數過程中,形參n的值變為5050。 返回主函數之後,輸出實參n的值仍為100。可見實參的值不隨形參的變化而變化。
㈣ C語言里子函數可以調用子函數嗎
可以的。
C語言規定,任意函數均可以嵌套調用。所以子函數可以調用其它子函數,也可以調用自身。
如
intfunc(inta)
{
if(a==0)return0;
returnfunc(a-1)+a;
}
這樣調用自身的稱為遞歸調用。
又如:
intfa(inta)
{
returna*a;
}
intfb(inta)
{
returnfa(a)+fa(a);
}
這就是不同函數調用的例子。
㈤ C語言實現三次樣條插值的子函數
void SPL(int n, double *x, double *y, int ni, double *xi, double *yi); 是你所要。
已知 n 個點 x,y; x 必須已按順序排好。要插值 ni 點,橫坐標 xi[], 輸出 yi[]。
程序里用double 型,保證計算精度。
SPL調用現成的程序。
現成的程序很多。端點處理方法不同,結果會有不同。想同matlab比較,你需 嘗試 調用 spline()函數 時,令 end1 為 1, 設 slope1 的值,令 end2 為 1 設 slope2 的值。
#include <stdio.h>
#include <math.h>
int spline (int n, int end1, int end2,
double slope1, double slope2,
double x[], double y[],
double b[], double c[], double d[],
int *iflag)
{
int nm1, ib, i, ascend;
double t;
nm1 = n - 1;
*iflag = 0;
if (n < 2)
{ /* no possible interpolation */
*iflag = 1;
goto LeaveSpline;
}
ascend = 1;
for (i = 1; i < n; ++i) if (x[i] <= x[i-1]) ascend = 0;
if (!ascend)
{
*iflag = 2;
goto LeaveSpline;
}
if (n >= 3)
{
d[0] = x[1] - x[0];
c[1] = (y[1] - y[0]) / d[0];
for (i = 1; i < nm1; ++i)
{
d[i] = x[i+1] - x[i];
b[i] = 2.0 * (d[i-1] + d[i]);
c[i+1] = (y[i+1] - y[i]) / d[i];
c[i] = c[i+1] - c[i];
}
/* ---- Default End conditions */
b[0] = -d[0];
b[nm1] = -d[n-2];
c[0] = 0.0;
c[nm1] = 0.0;
if (n != 3)
{
c[0] = c[2] / (x[3] - x[1]) - c[1] / (x[2] - x[0]);
c[nm1] = c[n-2] / (x[nm1] - x[n-3]) - c[n-3] / (x[n-2] - x[n-4]);
c[0] = c[0] * d[0] * d[0] / (x[3] - x[0]);
c[nm1] = -c[nm1] * d[n-2] * d[n-2] / (x[nm1] - x[n-4]);
}
/* Alternative end conditions -- known slopes */
if (end1 == 1)
{
b[0] = 2.0 * (x[1] - x[0]);
c[0] = (y[1] - y[0]) / (x[1] - x[0]) - slope1;
}
if (end2 == 1)
{
b[nm1] = 2.0 * (x[nm1] - x[n-2]);
c[nm1] = slope2 - (y[nm1] - y[n-2]) / (x[nm1] - x[n-2]);
}
/* Forward elimination */
for (i = 1; i < n; ++i)
{
t = d[i-1] / b[i-1];
b[i] = b[i] - t * d[i-1];
c[i] = c[i] - t * c[i-1];
}
/* Back substitution */
c[nm1] = c[nm1] / b[nm1];
for (ib = 0; ib < nm1; ++ib)
{
i = n - ib - 2;
c[i] = (c[i] - d[i] * c[i+1]) / b[i];
}
b[nm1] = (y[nm1] - y[n-2]) / d[n-2] + d[n-2] * (c[n-2] + 2.0 * c[nm1]);
for (i = 0; i < nm1; ++i)
{
b[i] = (y[i+1] - y[i]) / d[i] - d[i] * (c[i+1] + 2.0 * c[i]);
d[i] = (c[i+1] - c[i]) / d[i];
c[i] = 3.0 * c[i];
}
c[nm1] = 3.0 * c[nm1];
d[nm1] = d[n-2];
}
else
{
b[0] = (y[1] - y[0]) / (x[1] - x[0]);
c[0] = 0.0;
d[0] = 0.0;
b[1] = b[0];
c[1] = 0.0;
d[1] = 0.0;
}
LeaveSpline:
return 0;
}
double seval (int n, double u,
double x[], double y[],
double b[], double c[], double d[],
int *last)
{
int i, j, k;
double w;
i = *last;
if (i >= n-1) i = 0;
if (i < 0) i = 0;
if ((x[i] > u) || (x[i+1] < u))
{
i = 0;
j = n;
do
{
k = (i + j) / 2;
if (u < x[k]) j = k;
if (u >= x[k]) i = k;
}
while (j > i+1);
}
*last = i;
w = u - x[i];
w = y[i] + w * (b[i] + w * (c[i] + w * d[i]));
return (w);
}
void SPL(int n, double *x, double *y, int ni, double *xi, double *yi)
{
double *b, *c, *d;
int iflag,last,i;
b = (double *) malloc(sizeof(double) * n);
c = (double *)malloc(sizeof(double) * n);
d = (double *)malloc(sizeof(double) * n);
if (!d) { printf("no enough memory for b,c,d\n");}
else {
spline (n,0,0,0,0,x,y,b,c,d,&iflag);
if (iflag==0) printf("I got coef b,c,d now\n"); else printf("x not in order or other error\n");
for (i=0;i<ni;i++) yi[i] = seval(ni,xi[i],x,y,b,c,d,&last);
free(b);free(c);free(d);
};
}
main(){
double x[6]={0.,1.,2.,3.,4.,5};
double y[6]={0.,0.5,2.0,1.6,0.5,0.0};
double u[8]={0.5,1,1.5,2,2.5,3,3.5,4};
double s[8];
int i;
SPL(6, x,y, 8, u, s);
for (i=0;i<8;i++) printf("%lf %lf \n",u[i],s[i]);
return 0;
}
㈥ c語言中參數是什麼概念
函數的參數分為形參和實參兩種。
形參出現在函數定義中,在整個函數體內都可以使用,離開該函數則不能使用。實參出現在主調函數中,進入被調函數後,實參變數也不能使用。
形參和實參的功能是作數據傳送,發生函數調用時,主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送。
舉個例子:
定義一個函數s=f(a,b),功能是將a和b的差賦值給s,那麼,a和b就是這個函數的兩個參數。
(6)c語言子函數參數擴展閱讀:
C語言的參數傳遞方式
方法有3種方式:值傳遞、地址傳遞、引用傳遞
tips:
被調用函數的形參只有函數被調用時才會臨時分配存儲單元,一旦調用結束佔用的內存便會被釋放
值傳遞和地址傳遞,傳遞的都是實參的一個拷貝
C語言中實參和形參之間的數據傳遞是單向的「值傳遞」,單向傳遞,只能由實參傳給形參,反之不行
輸出格式並沒有選擇%p而是選擇了%d,因為十進制的數看起來更直觀。
值傳遞
如果只是傳遞值的話:
#include <stdio.h>
//值傳遞傳值
void swap( int x, int y);
int main()
{
int a=2,b=3;
printf("before:實參為a,b a=%d,地址為%d b=%d,地址為%d ",a,&a,b,&b);
swap(a,b);
printf("after:實參為a,b a=%d,地址為%d b=%d,地址為%d ",a,&a,b,&b);
return 0;
}
void swap(int x,int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("inside:形參為x,y x=%d,地址為%d y=%d,地址為%d ",x,&x,y,&y);
}
㈦ C語言指針變數的賦值和做函數的參數
1、指針變數的賦值,分為定義時賦值(初始化)和單獨賦值,如:
intx;
int*px=&x;//定義時賦值,也稱初始化,注意這里的*是跟隨int的,即變數px是int*類型變數!實際上的賦值語句是px=&x;
int*py;
py=&x;//單獨賦值,將py指向x
*py=10;//這里的*,是引用指針中的數據操作符,*跟隨的變數必須是指針類型變數,否則會出錯!*py就是x,這里相當於x=10;
2、指針變數作為函數的參數時,子函數可以通過指針引用實參地址中的數據,達到修改實參地址中的數據。如:
#include<stdio.h>
voidfunc(inta,intb,int*pmax)
{
if(a>b)*pmax=a;
else*pmax=b;
}
voidmain()
{
inta=2,b=3,max=0;
func(a,b,&max);//這里將變數max的地址傳遞到子函數,子函數中通過該地址,可以修改max的值,達到子函數結束後,max能帶回運算結果的效果。
printf("max=%d ",max);
}