首先要理解一點(diǎn),數(shù)組在做參數(shù)傳遞的過程中會(huì)損失數(shù)組的長度信息,退化成一個(gè)指針
我們注重客戶提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站服務(wù),我們努力開拓更好的視野,通過不懈的努力,創(chuàng)新互聯(lián)建站贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),重慶小程序開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫的技術(shù)開發(fā)工程師。
例如你形參寫成(char s[10]),或者干脆(char s[]),函數(shù)只能接收到一個(gè)char *
所以:
char dp[n][m]的類型本質(zhì)上是數(shù)組的指針,即char (*)[m],它是指向長度為m的char數(shù)組的指針
char **是char *的指針,指針是由數(shù)組退化來的,所以一般來說,它原來是一個(gè)char *的數(shù)組,即 char *ps[m]。
數(shù)組的數(shù)組(或數(shù)組的指針)和指針的數(shù)組(或指針的指針),當(dāng)然是不同的兩個(gè)類型。
至于如何修改,需要你明確你的函數(shù)要處理數(shù)組的數(shù)組,還是指針的數(shù)組,再根據(jù)情況修改。
如果是數(shù)組的數(shù)組,那么參數(shù)變?yōu)椋簍estlength(char (*p)[max],注意這里只能是數(shù)或者宏,不能是變量,調(diào)用時(shí)實(shí)參不用變化
如果是指針的數(shù)組,那么參數(shù)不變,char **dp,實(shí)參變?yōu)椋篶har *p[2] = {s1, s2}
#include?stdio.h
//指針加*是不會(huì)改變其指向的,只會(huì)修改其中的內(nèi)容
int?*f(int?*s,?int?*t) //s指向i,t指向j
{
if?(*s??*t) //這里比較的是i與j的值
{
*s?=?*t; //*s表示取s地址的內(nèi)容,即i,所以*t是表示j,這里是將j賦值給i
//所以改變了i的值,但是并沒有改變s與t的指向,還是分別指向i與j
}
return?s;
}
int?main()
{
int?i?=?3,?j?=?5;
int?*p?=?i; //p是指向i的
int?*q?=?j; //q是指向j的
int?*r;
r?=?f(p,?q); //將s的地址賦值給r
printf("%d,?%d,?%d,?%d,?%d\n",?i,?j,?*p,?*q,?*r);
return?0;
}
運(yùn)行結(jié)果是:5, 5, 5, 5, 5
#include?stdio.h
int?k?=?5;
void?f(int?*s) //這里傳參只是將p的地址賦值給s,也就是將s指向了m
{
s?=?k; //將s指向k,并沒有改變p的指向
}
int?main()
{
int?m?=?3;
int?*p?=?m;
f(p); //所以程序執(zhí)行完,p還是指向m,而s是指向k的
printf("%d,?%d\n",?m,?*p);
return?0;
}
運(yùn)行結(jié)果:3, 3
#include?stdio.h
//指針加*是不會(huì)改變其指向的,只會(huì)修改其中的內(nèi)容
//如果指針不加*,則賦值就是改變其指向
int?*f(int?*s,?int?*t) //s指向i,t指向j
{
if?(*s??*t) //這里比較的是i與j的值
{
s?=?t; //s表示的是指針,這里不是表示其內(nèi)容,所以這里是將t指向的地址賦值給了s
//也就是s與t是指向同一塊內(nèi)存空間,也就是將s也指向了j
}
return?s;
}
int?main()
{
int?i?=?3,?j?=?5;
int?*p?=?i; //p是指向i的
int?*q?=?j; //q是指向j的
int?*r;
r?=?f(p,?q); //將s的地址賦值給r,r也指向了j
printf("%d,?%d,?%d,?%d,?%d\n",?i,?j,?*p,?*q,?*r);
return?0;
}
運(yùn)行結(jié)果:3, 5, 3, 5, 5
這一類題目其實(shí)只要打個(gè)草稿就行了,寫兩個(gè)數(shù)字,然后*p就是表示取其中的內(nèi)容,p就表示其指向(也就是內(nèi)容的地址),只要是加*的賦值就表示改變其p指向的變量賦值,如果沒有加*就是改變指針的指向。
C語言中參數(shù)分為實(shí)際參數(shù)(實(shí)參)與形式參數(shù)(形參)。
實(shí)際參數(shù)是在調(diào)用時(shí)傳遞個(gè)該函數(shù)的參數(shù)。
形式參數(shù)是在定義函數(shù)名和函數(shù)體的時(shí)候使用的參數(shù),目的是用來接收調(diào)用該函數(shù)時(shí)傳如的參數(shù)。
實(shí)際參數(shù)是在調(diào)用時(shí)傳遞個(gè)該函數(shù)的參數(shù).
舉一個(gè)很簡單的例子:
#includestdio.h
int f(int b) // b為形參
{
return b;
}
void main()
{
int a=1;
printf("%d",f(a));// a為實(shí)參
}
給你舉個(gè)例子吧,這樣就容易理解得多。
例子:設(shè)計(jì)一個(gè)函數(shù)func();在調(diào)用它時(shí)每次實(shí)現(xiàn)不同的函數(shù)功能,輸入兩個(gè)參數(shù)a和b,第一次調(diào)用func()時(shí)找出a和b中的較大者,第二次調(diào)用找出較小者,第三次調(diào)用求a和b之和。
說明:格式
(*p)()
表示定義一個(gè)指向函數(shù)的指針變量p,在c語言中這個(gè)格式是固定的,前面的()表示p先和*結(jié)合,是指針變量,后面的()表示p指向一個(gè)函數(shù)。前面的()不能省略,如果寫成
*p(),由于()優(yōu)先級(jí)比*高,那就表示p()函數(shù)返回的是一個(gè)指針,p本身就是函數(shù)不是指針了,意思完全變了。
任何一個(gè)函數(shù),函數(shù)名就是該函數(shù)的入口地址(起始地址),也就是說函數(shù)名就是個(gè)地址,從這個(gè)地址開始,函數(shù)占用一段內(nèi)存單元。因此可以用一個(gè)指針變量來指向這個(gè)這個(gè)函數(shù)名,這樣就相當(dāng)于指向這個(gè)函數(shù)了。所以下面的max,min,add函數(shù)都是一個(gè)地址,分別調(diào)用時(shí)就是賦值p=max,p=min,p=add,也就是(*p)(x,y)分別就等于max(x,y),min(x,y),add(x,y).
程序在win-tc和Dev-c++下調(diào)試通過。
#include
stdio.h
#include
conio.h
int
max(int
x,int
y)
{
return(xy?x:y);
}
int
min(int
x,int
y)
{
return(xy?x:y);
}
int
add(int
x,int
y)
{
return(x+y);
}
int
func(int
x,int
y,int
(*p)())
/*定義指向函數(shù)的指針變量p,關(guān)鍵1*/
{int
result;
result=(*p)(x,y);
/*調(diào)用相應(yīng)函數(shù),函數(shù)名即地址給p,這樣p指向該函數(shù),關(guān)鍵2*/
printf("%d\n",result);
}
main()
{
int
a,b;
printf("Please
input
two
integers
a
and
b:\n");
scanf("%d%d",a,b);
printf("max=");
func(a,b,max);/*相當(dāng)于賦值p=max*/
printf("min=");
func(a,b,min);/*相當(dāng)于賦值p=min*/
printf("add=");
func(a,b,add);/*相當(dāng)于賦值p=add*/
getch();
}
看看這個(gè)例子就知道了,在同一文件夾先編譯hello.c再編譯main.c運(yùn)行
main.c
#include?stdio.h
#include?process.h
int?main()
{
char?a[100];
int?b;
printf("調(diào)用hello.exe,?第一個(gè)參數(shù)為改應(yīng)用程序的名稱\n");
execl("hello.exe","1hello","2hello",NULL);
printf("進(jìn)程已經(jīng)被遞交給了hello.exe,這里不會(huì)再執(zhí)行");
return?0;
}
hello.c
#include?stdio.h
int?main(int?argc,?char?*argv[])
{
int?i;
printf("命令行參數(shù)有%d個(gè),分別是:\n",argc);
for(i=0;iargc;i++)
printf("%s\n",argv[i]);
return?0;
}
除了execl
還有spawnl:
文章題目:c語言函數(shù)參數(shù)問題 c語言函數(shù)參數(shù)太多問題如何解決
URL地址:http://jinyejixie.com/article16/dosscdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營銷推廣、軟件開發(fā)、標(biāo)簽優(yōu)化、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)