C語言實(shí)現(xiàn)給函數(shù)加鎖 c語言實(shí)現(xiàn)讀寫鎖

今天自學(xué)了C語言函數(shù)一章,大體有個(gè)了解。但是還有很多問題,麻煩高手給我解釋下!先謝謝各位了!

第一段代碼只要把

創(chuàng)新互聯(lián)于2013年開始,先為安塞等服務(wù)建站,安塞等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為安塞企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

int a[4]={"1,2,3,4"}; 改為 int a[4]={1,2,3,4};

就正確了

運(yùn)行的結(jié)果是輸入 1

第二段代碼除了要把引號改掉外,

Han(a[4]); 也要改為 Han(a); 運(yùn)行的結(jié)果是輸出1,或者 Han(a[4]);運(yùn)行的結(jié)果是輸出4

c語言static的作用和用法

static在c語言中是私有、靜態(tài)意思。

用于在函數(shù)中聲明“靜態(tài)變量”用,在每一次調(diào)用后,該變量并不在函數(shù)返回時(shí)立即釋放,變量中保存的值,可以保留到下一次調(diào)用時(shí)繼續(xù)有效。

私有就是隱藏。static函數(shù)只能聲明后的本文中調(diào)用。static全局變量只能聲明后的本文中調(diào)用。static局部變量只能聲明后的本函數(shù)調(diào)用

靜態(tài)就是一直存在,相對于每次調(diào)用動(dòng)態(tài)分配而言。static函數(shù)未驗(yàn)證是否每次調(diào)用代碼地址都是一致的。static全局變量生命周期到程序或進(jìn)程結(jié)束。static局部變量生命周期到程序或進(jìn)程結(jié)束。

static的使用和作用

靜態(tài)全局變量。全局變量前加static,修飾全局變量為靜態(tài)全局變量,改變?nèi)肿兞康目梢娦浴lo態(tài)局部變量。局部變量前加static,修飾局部變量為靜態(tài)局部變量,改變局部變量的銷毀時(shí)期。靜態(tài)函數(shù)。函數(shù)返回類型前加static,修飾函數(shù)為靜態(tài)函數(shù),改變函數(shù)的可見性。

類的靜態(tài)成員。類成員前加static,修飾類的成員為類的靜態(tài)成員,實(shí)現(xiàn)多個(gè)對象之間的數(shù)據(jù)共享,并且使用靜態(tài)成員不會破壞封裝性,也保證了安全性。類的靜態(tài)函數(shù),類函數(shù)前加static,修飾類的函數(shù)為靜態(tài)函數(shù),減少資源消耗,不需要實(shí)例化就可以使用。

如何用c語言實(shí)現(xiàn)CString的構(gòu)造函數(shù),析構(gòu)函數(shù)和賦值函數(shù)

1、首先C語言沒辦法實(shí)現(xiàn)構(gòu)造函數(shù)和析構(gòu)函數(shù),因?yàn)镃語言是面向過程的語言,沒有定義面向?qū)ο蟮腸lass概念。C++語言是以C語言為基礎(chǔ)擴(kuò)展出來的一種編程語言,它在繼承了C語言的基礎(chǔ)上,增加了面向?qū)ο蟮木幊谭椒ǎ渲芯桶薱lass。

2、如果你所描述的c語言是指C++語言,那么是可以自已定義并實(shí)現(xiàn)CString類的一些功能。因?yàn)镃String類是微軟VC++ MFC實(shí)現(xiàn)的基礎(chǔ)類,而非C++標(biāo)準(zhǔn)類庫,所以CString類定義中使用了一些AFX函數(shù),依賴于MFC環(huán)境,所以想自定義一個(gè)完全取代CString的類很困難,也無意義。

3、如果只是需要學(xué)習(xí)CString的構(gòu)造函數(shù)、析構(gòu)函數(shù)及賦值函數(shù),可以參考MFC類庫源文件:

\MICROSOFT VISUAL STUDIO\VC98\MFC\Include\AFX.INL

\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\STRCORE.CPP

\MICROSOFT VISUAL STUDIO\VC98\MFC\SRC\WINSTR.CPP

C語言編寫

#includestdio.h

#define N 20

int fun(char a[])

{

int i,j,num=0;

char b[N];

for(i=0,j=0; iN; i++)

{

if(a[i]='0' a[i]='9')

num++;

else

{b[j]=a[i]; j++;}

}

printf("刪除數(shù)字字符后的數(shù)組:\n",b);

printf("%s\n",b);

return num;

}

void main()

{

char c[N];

int num=0;

printf("輸入字符串:");

scanf("%s",c);

num=fun(c);

printf("刪除數(shù)字字符的個(gè)數(shù)為:%d\n",num);

}

C語言調(diào)用函數(shù)怎么讓調(diào)用的函數(shù)可控性

我想,你只要看了C語言上關(guān)于傳值函數(shù)調(diào)用的測試題,一切都會了然于胸:

1. 考題一:程序代碼如下:

void Exchg1(int x, int y)

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf(“x=%d,y=%d/n”,x,y)

}

void main()

{

int a=4,b=6;

Exchg1 (a,b) ;

printf(“a=%d,b=%d/n”,a,b)

}

輸出的結(jié)果:

x=____, y=____

a=____, b=____

問下劃線的部分應(yīng)是什么,請完成。

2. 考題二:代碼如下。

Exchg2(int *px, int *py)

{

int tmp=*px;

*px=*py;

*py=tmp;

print(“*px=%d,*py=%d/n”,*px,*py);

}

main()

{

int a=4;

int b=6;

Exchg2(a,b);

Print(“a=%d,b=%d/n”, a, b);

}

輸出的結(jié)果為:

*px=____, *py=____

a=____, b=____

問下劃線的部分應(yīng)是什么,請完成。

3. 考題三:

Exchg2(int x, int y)

{

int tmp=x;

x=y;

y=tmp;

print(“x=%d,y=%d/n”,x,y);

}

main()

{

int a=4;

int b=6;

Exchg2(a,b);

Print(“a=%d,b=%d/n”, a, b);

}

二. 函數(shù)參數(shù)傳遞方式之一:值傳遞

1. 值傳遞的一個(gè)錯(cuò)誤認(rèn)識

先看題一中Exchg1函數(shù)的定義:

void Exchg1(int x, int y) //定義中的x,y變量被稱為Exchg1函數(shù)的形式參數(shù)

{

int tmp;

tmp=x;

x=y;

y=tmp;

printf(“x=%d,y=%d/n”,x,y)

}

問:你認(rèn)為這個(gè)函數(shù)是在做什么呀?

答:好像是對參數(shù)x,y的值對調(diào)吧?

請往下看,我想利用這個(gè)函數(shù)來完成對a,b兩個(gè)變量值的對調(diào),程序如下:

void main()

{

int a=4,b=6;

Exchg1 (a,b) //a,b變量為Exchg1函數(shù)的實(shí)際參數(shù)。

/ printf(“a=%d,b=%d/n”,a,b)

}

我問:Exchg1 ()里頭的 printf(“x=%d,y=%d/n”,x,y)語句會輸出什么啊?

我再問:Exchg1 ()后的 printf(“a=%d,b=%d/n”,a,b)語句輸出的是什么?

程序輸出的結(jié)果是:

x=6 , y=4

a=4 , b=6 //為什么不是a=6,b=4呢?

奇怪,明明我把a(bǔ),b分別代入了x,y中,并在函數(shù)里完成了兩個(gè)變量值的交換,為什么a,b變量值還是沒有交換(仍然是a==4,b==6,而不是a==6,b==4)?如果你也會有這個(gè)疑問,那是因?yàn)槟愀揪筒恢獙?shí)參a,b與形參x,y的關(guān)系了。

2. 一個(gè)預(yù)備的常識

為了說明這個(gè)問題,我先給出一個(gè)代碼:

int a=4;

int x;

x=a;

x=x+3;

看好了沒,現(xiàn)在我問你:最終a值是多少,x值是多少?

(怎么搞的,給我這個(gè)小兒科的問題。還不簡單,不就是a==4 x==7嘛?。?/p>

在這個(gè)代碼中,你要明白一個(gè)東西:雖然a值賦給了x,但是a變量并不是x變量哦。我們對x任何的修改,都不會改變a變量。呵呵!雖然簡單,并且一看就理所當(dāng)然,不過可是一個(gè)很重要的認(rèn)識喔。

3. 理解值傳遞的形式

看調(diào)用Exch1函數(shù)的代碼:

main()

{

int a=4,b=6;

Exchg1(a,b) //這里調(diào)用了Exchg1函數(shù)

printf(“a=%d,b=%d”,a,b)

}

Exchg1(a,b)時(shí)所完成的操作代碼如下所示。

int x=a;//←

int y=b;//←注意這里,頭兩行是調(diào)用函數(shù)時(shí)的隱含操作

int tmp;

tmp=x;

x=y;

y=tmp;

請注意在調(diào)用執(zhí)行Exchg1函數(shù)的操作中我人為地加上了頭兩句:

int x=a;

int y=b;

這是調(diào)用函數(shù)時(shí)的兩個(gè)隱含動(dòng)作。它確實(shí)存在,現(xiàn)在我只不過把它顯式地寫了出來而已。問題一下就清晰起來啦。(看到這里,現(xiàn)在你認(rèn)為函數(shù)里面交換操作的是a,b變量或者只是x,y變量呢?)

原來 ,其實(shí)函數(shù)在調(diào)用時(shí)是隱含地把實(shí)參a,b

的值分別賦值給了x,y,之后在你寫的Exchg1函數(shù)體內(nèi)再也沒有對a,b進(jìn)行任何的操作了。交換的只是x,y變量。并不是a,b。當(dāng)然a,b的值沒有

改變啦!函數(shù)只是把a(bǔ),b的值通過賦值傳遞給了x,y,函數(shù)里頭操作的只是x,y的值并不是a,b的值。這就是所謂的參數(shù)的值傳遞了。

哈哈,終于明白了,正是因?yàn)樗[含了那兩個(gè)的賦值操作,才讓我們產(chǎn)生了前述的迷惑(以為a,b已經(jīng)代替了x,y,對x,y的操作就是對a,b的操作了,這是一個(gè)錯(cuò)誤的觀點(diǎn)?。。?。

三. 函數(shù)參數(shù)傳遞方式之二:地址傳遞

繼續(xù)——地址傳遞的問題!

看題二的代碼:

Exchg2(int *px, int *py)

{

int tmp=*px;

*px=*py;

*py=tmp;

print(“*px=%d,*py=%d/n”,*px,*py);

}

main()

{

int a=4;

int b=6;

Exchg2(a,b);

Print(“a=%d,b=%d/n”, a, b);

}

它的輸出結(jié)果是:

*px=6,*py=4

a=6,b=4

看函數(shù)的接口部分:Exchg2(int *px,int *py),請注意:參數(shù)px,py都是指針。

再看調(diào)用處:Exchg2(a, b);

它將a的地址(a)代入到px,b的地址(b)代入到py。同上面的值傳遞一樣,函數(shù)調(diào)用時(shí)作了兩個(gè)隱含的操作:將a,b的值賦值給了px,py。

px=a;

py=b;

呵呵!我們發(fā)現(xiàn),其實(shí)它與值傳遞并沒有什么不同,只不過這里是將a,b的地址值傳遞給了px,py,而不是傳遞的a,b的內(nèi)容,而(請好好地在比較比較啦)

整個(gè)Exchg2函數(shù)調(diào)用是如下執(zhí)行的:

px=a; //

py=b; //請注意這兩行,它是調(diào)用Exchg2的隱含動(dòng)作。

int tmp=*px;

*px=*py;

*py=tmp;

print(“*px=%d,*py=%d/n”,*px,*py);

這樣,有了頭兩行的隱含賦值操作。我們現(xiàn)在已經(jīng)可以看出,指針px,py的值已經(jīng)分別是a,b變量的地址值了。接下來,對*px,*py的操作當(dāng)然也就是

對a,b變量本身的操作了。所以函數(shù)里頭的交換就是對a,b值的交換了,這就是所謂的地址傳遞(傳遞a,b的地址給了px,py),你現(xiàn)在明白了嗎?

四. 函數(shù)參數(shù)傳遞方式之三:引用傳遞

看題三的代碼:

Exchg3(int x, int y) //注意定義處的形式參數(shù)的格式與值傳遞不同

{

int tmp=x;

x=y;

y=tmp;

print(“x=%d,y=%d/n”,x,y);

}

main()

{

int a=4;

int b=6;

Exchg3(a,b); //注意:這里調(diào)用方式與值傳遞一樣

Print(“a=%d,b=%d/n”, a, b);

}

輸出結(jié)果:

x=6, y=4

a=6, b=4 //這個(gè)輸出結(jié)果與值傳遞不同。

看到?jīng)]有,與值傳遞相比,代碼格式上只有一處是不同的,即在定義處:

Exchg3(int x, int y)。

但是我們發(fā)現(xiàn)a與b的值發(fā)生了對調(diào)。這說明了Exchg3(a,b)里頭修改的是a,b變量,而不只是修改x,y了。

我們先看Exchg3函數(shù)的定義處Exchg3(int x,int

y)。參數(shù)x,y是int的變量,調(diào)用時(shí)我們可以像值傳遞(如: Exchg1(a,b); )一樣調(diào)用函數(shù)(如: Exchg3(a,b);

)。但是x,y前都有一個(gè)取地址符號。有了這個(gè),調(diào)用Exchg3時(shí)函數(shù)會將a,b

分別代替了x,y了,我們稱x,y分別引用了a,b變量。這樣函數(shù)里頭操作的其實(shí)就是實(shí)參a,b本身了,也就是說函數(shù)里是可以直接修改到a,b的值了。

最后對值傳遞與引用傳遞作一個(gè)比較:

1. 在函數(shù)定義格式上有不同:

值傳遞在定義處是:Exchg1(int x, int y);

引用傳遞在這義處是:Exchg1(int x, int y);

2. 調(diào)用時(shí)有相同的格式:

值傳遞:Exchg1(a,b);

引用傳遞:Exchg3(a,b);

3. 功能上是不同的:

值傳遞的函數(shù)里操作的不是a,b變量本身,只是將a,b值賦給了x,y函數(shù)里操作的只是x,y變量而不是a,b,顯示a,b的值不會被Exchg1函數(shù)所修改。

引用傳遞Exchg3(a,b)函數(shù)里是用a,b分別代替了x,y。函數(shù)里操作的是a,b。

新聞名稱:C語言實(shí)現(xiàn)給函數(shù)加鎖 c語言實(shí)現(xiàn)讀寫鎖
標(biāo)題URL:http://muchs.cn/article2/docoeoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站移動(dòng)網(wǎng)站建設(shè)、軟件開發(fā)、電子商務(wù)定制開發(fā)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司