c語言指針范文

時(shí)間:2023-04-03 09:59:48

導(dǎo)語:如何才能寫好一篇c語言指針,這就需要搜集整理更多的資料和文獻(xiàn),歡迎閱讀由公務(wù)員之家整理的十篇范文,供你借鑒。

c語言指針

篇1

關(guān)鍵詞: C語言 指針 函數(shù) 數(shù)組

“指針”是C語言中廣泛使用的一種數(shù)據(jù)類型,運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針可以表示各種數(shù)據(jù)結(jié)構(gòu),它與函數(shù)、數(shù)組的使用和傳遞數(shù)據(jù)有密切聯(lián)系,能方便地訪問數(shù)組,還能像匯編語言一樣處理內(nèi)存地址,從而編出精致而高效的程序。指針極大地強(qiáng)化了C語言的功能。學(xué)習(xí)指針是學(xué)習(xí)C語言最重要的一環(huán),能否正確理解和使用指針是判斷是否掌握了C語言的重要標(biāo)志。但是指針也是C語言最危險(xiǎn)的特性,如果使用不當(dāng),則很容易指到意想不到的地方,產(chǎn)生錯(cuò)誤也很難發(fā)現(xiàn)。因此,對于初學(xué)者來說,應(yīng)特別注意指針的應(yīng)用。怎樣才能應(yīng)用好指針呢?下面筆者以在計(jì)算機(jī)C語言教學(xué)中的體會(huì)與大家進(jìn)行探討。

一、理解指針

在C語言中任何數(shù)據(jù)只要定義了,在內(nèi)存中就是有一定的存儲(chǔ)單元的。存儲(chǔ)單元就是變量在計(jì)算機(jī)中的存儲(chǔ)地址,指針就是用來表示這些地址的變量。所以簡單地說,指針就是地址,變量的指針就是變量的地址,這里還涉及一個(gè)概念就是指針變量,所謂指針變量就是用來存放指針(地址)的變量。例如:int a;假設(shè)a的地址是2000,而2000又存儲(chǔ)在變量point中,那么變量point就是指針的變量簡稱指針變量,a就是指針變量所指向的變量。很多初學(xué)者都存在這樣的誤區(qū):既然指針放的是地址,而2000正好是變量a的地址,那么對于指針point就可以這樣賦值:point=2000,這是錯(cuò)誤的,這里的2000表示的不是地址是一個(gè)整型數(shù)據(jù)。所以對于指針變量的賦值只能用取地址運(yùn)算符“&”進(jìn)行賦值即:point=&a;&a即為a的地址。

二、指針與函數(shù)

指針作為C語言的精華有很多用途,除具有一般的功能外,其中具體特殊功能的應(yīng)用總結(jié)起來有三個(gè)方面:一是用于在函數(shù)中可以返回多個(gè)值;二是可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)用函數(shù);三是實(shí)現(xiàn)數(shù)組的動(dòng)態(tài)定義。其中,普通變量作為函數(shù)的參數(shù),傳遞的是變量的值,因此只能帶回一個(gè)返回值,但在有些場合需要返回多個(gè)值,這就必須用到指針做函數(shù)的參數(shù),因?yàn)橹羔樧鳛閰?shù)傳遞的是地址,讓實(shí)參和形參指向同一個(gè)變量的地址,N個(gè)形參所指向的變量的值改變了,N個(gè)實(shí)參的值也自然改變了,從而實(shí)現(xiàn)了帶回多個(gè)返回值。這里舉個(gè)例子,編寫一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)從小到大輸出。這個(gè)程序需要子函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換,把交換后的兩個(gè)值通過指針傳回主函數(shù)輸出,傳回來的是兩個(gè)值。所以普通變量做函數(shù)的參數(shù)是無法實(shí)現(xiàn)的,只能用指針作為函數(shù)的參數(shù)。具體實(shí)現(xiàn):

子函數(shù)實(shí)現(xiàn)交換:

swap(p1,p2)

int *p1,*p2;

{int p;

p=*p1;

*p1=*p2;

*p2=p;

}

主程序?qū)崿F(xiàn)調(diào)用,輸出:

main()

{int a,b;

int *pointer_1,*pointer_2;

scanf(“%d,%d”,&a,&b);

point_ 1=&a;

point_2=&b;

if(a

swap(point_1,point_2);

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

}

由此可見,要通過函數(shù)調(diào)用得到N個(gè)返回值可以通過以下三步實(shí)現(xiàn):(1)主調(diào)函數(shù)中設(shè)N個(gè)變量,用N個(gè)指針指向他們;(2)將指針變量作實(shí)參,將N個(gè)變量的地址傳給形參;(3)通過形參指針變量指向的改變,改變N個(gè)變量的值。最后主調(diào)函數(shù)中就可以得到N個(gè)變量的返回值。

三、指針與數(shù)組

前面提到任何數(shù)據(jù)都有存儲(chǔ)單元,都有指針。所以,從這個(gè)角度出發(fā)可以將指針分為:指向變量的指針、數(shù)組指針、字符指針、指向指針的指針、函數(shù)指針、結(jié)構(gòu)變量的指針及文件指針,等等。其中,指向變量的指針就是存儲(chǔ)變量的地址的,這是指針最簡單的一種類型。那么一個(gè)變量有地址,一個(gè)數(shù)組有若干個(gè)元素,每個(gè)元素都有一個(gè)地址,所謂數(shù)組的指針,就是指數(shù)組的名稱,實(shí)際上是指向整個(gè)數(shù)組空間的起始地址。數(shù)組元素的指針是數(shù)組元素的地址。例如:int a[10];int*p;這里的數(shù)組名a就是數(shù)組的首地址,本質(zhì)上是一個(gè)指針。a[2]表示距離a指向空間向后2個(gè)位置所在空間中的存放的值,所以a[2]=*(a+2)。那么如果讓p=a,p就是指向數(shù)組的指針,對于a我們可以做加減整數(shù)運(yùn)算,利用它表示數(shù)組中任何數(shù)據(jù)的值。那么對于指針也可以通過加減整數(shù)運(yùn)算來表示數(shù)組中的任何數(shù)據(jù)。指針變量加上或減區(qū)一個(gè)整數(shù)n表示把指針指向的當(dāng)前位置向前或向后移動(dòng)n個(gè)位置。具體移動(dòng)的字節(jié)數(shù)和指針數(shù)組的類型在內(nèi)存所占的字節(jié)數(shù)有關(guān)系,如果指針數(shù)組類型為整型,在內(nèi)存中占2個(gè)字節(jié),那么,指針p+1,實(shí)際上的地址值就是原址加2,對于數(shù)組元素來說就是指針向后移動(dòng)一個(gè)元素。如int a[10],*p,*s;p=a;s=p+2;其中s的值表示數(shù)組中首地址向后移動(dòng)2個(gè)數(shù)組元素的位置,表示a[2]對應(yīng)的地址,而具體移動(dòng)的字節(jié)數(shù)則為4個(gè)字節(jié)。為了表示兩個(gè)地址間存在的距離,可以通過指針間的減法實(shí)現(xiàn)。指針之間是不能有加法操作的,指針的加減運(yùn)算只能對數(shù)組指針變量進(jìn)行,對指向其他類型的變量的指針變量做加減運(yùn)算是毫無意義的。而且兩個(gè)指針變量之間的運(yùn)算只有指向同一數(shù)組時(shí)它們之間才能進(jìn)行運(yùn)算,否則運(yùn)算將失去意義。

四、結(jié)語

C語言是到目前為止學(xué)習(xí)最多的程序設(shè)計(jì)語言之一,也是國外大學(xué)計(jì)算機(jī)專業(yè)唯一的必修課程。在整個(gè)C語言教學(xué)中,指針是一個(gè)十分重要的部分,也是最難掌握的部分之一。本文從對指針概念的理解、指針在函數(shù)和數(shù)組的使用等方面系統(tǒng)論述了指針,目的是讓大家清晰地了解指針、掌握指針,從而高效地應(yīng)用指針。只有掌握好指針,才能充分發(fā)揮C語言的優(yōu)勢。

參考文獻(xiàn):

[1]譚浩強(qiáng).C程序設(shè)計(jì)教程.北京:清華大學(xué)出版社,2008,11.

[2]陳剛.C語言程序設(shè)計(jì).清華大學(xué)出版社,2010,2.

篇2

【關(guān)鍵詞】C語言 指針 反匯編 間接尋址 寄存器 棧

1 引言

C語言誕生于20世紀(jì)70年代的美國貝爾實(shí)驗(yàn)室,它是面向過程的,可移植的,功能強(qiáng)大的高級程序設(shè)計(jì)語言。盡管現(xiàn)如今有許多功能更強(qiáng)大的面向?qū)ο蟮母呒壋绦蛟O(shè)計(jì)語言(如C++,Java,C#等),C語言仍然具有旺盛的生命力,其仍是計(jì)算機(jī)領(lǐng)域的通用程序設(shè)計(jì)語言,特別是在底層的硬件驅(qū)動(dòng)領(lǐng)域。這一切都要?dú)w功于指針,指針是C語言最重要的特性之一,利用它可以直接操作硬件,這是它的優(yōu)點(diǎn),也是它的缺點(diǎn),因?yàn)橹苯硬僮饔布杂胁簧?,就?huì)導(dǎo)致非常嚴(yán)重的后果。

2 C語言指針簡介

現(xiàn)代計(jì)算機(jī)中大部分都是按字節(jié)劃分內(nèi)存的,每個(gè)字節(jié)都有唯一的地址,C語言中的所有指針操作都是基于這些地址的。在C程序中一個(gè)變量會(huì)占用一個(gè)或多個(gè)字節(jié),第一個(gè)字節(jié)的地址就是該變量的地址,將該地址賦值給某個(gè)變量后,就稱其為指針。指針在C程序開發(fā)過程中發(fā)揮著舉足輕重的作用,其基本應(yīng)用有如下三點(diǎn):

2.1 指向基本數(shù)據(jù)類型

假設(shè)我們定義int i = 10,則我們就占用了4個(gè)字節(jié)的內(nèi)存(假設(shè)是在32位架構(gòu)下),這4個(gè)字節(jié)就和變量名i建立了某種特殊聯(lián)系,就可以通過該變量i對這4個(gè)字節(jié)進(jìn)行讀寫操作?;蛘呖梢酝ㄟ^指針方式操控這4個(gè)字節(jié)。定義int*p = &i,就將該變量的首地址賦值給了指針變量p。然后就可以通過*p,對這4個(gè)字節(jié)進(jìn)行讀寫操作。此時(shí)*p和i是完全等價(jià)的,即*p是變量i的別名。這是指針最基礎(chǔ)的應(yīng)用。

2.2 當(dāng)指針作為函數(shù)參數(shù)時(shí),它就可以發(fā)揮出強(qiáng)大的作用,特別是在數(shù)組,字符串,文件等的處理中

主要作用有如下兩點(diǎn):

2.2.1 讓函數(shù)返回多個(gè)值。假設(shè)有如下函數(shù)聲明

int foo(double * a,double * b);

則我們可以在函數(shù)內(nèi)部修改a和b,在函數(shù)返回時(shí),除了返回一個(gè)整型值外,還可以返回這兩個(gè)被修改過的浮點(diǎn)數(shù)。假如不希望修改這兩個(gè)浮點(diǎn)數(shù),可以加上const修飾,如下所示:

int foo(const double *a,const double *b);

則在函數(shù)內(nèi)部就不可以對變量a和b進(jìn)行修改。這種技術(shù)在字符串處理函數(shù)中應(yīng)用的特別多,是因?yàn)椴幌M醋址徽`改。例如:

char * strcpy(char *dest,const char *src);

2.2.2 節(jié)約內(nèi)存空間,提高運(yùn)行速度

在函數(shù)間傳遞數(shù)組,結(jié)構(gòu)體或文件時(shí),如果像傳遞普通變量那樣,將參數(shù)復(fù)制一個(gè)副本到函數(shù)棧幀,就會(huì)給程序帶來很大的開銷,浪費(fèi)空間和時(shí)間,因?yàn)檫@幾個(gè)變量不再像普通變量那樣只占幾個(gè)字節(jié),特別是文件通常都是很大的,從幾K到幾百M(fèi)。這時(shí)最好的解決方法就是把該結(jié)構(gòu)體變量或文件的地址傳遞出去,即多個(gè)函數(shù)操作的是同一個(gè)內(nèi)存塊。

2.3 指針還可應(yīng)用于動(dòng)態(tài)內(nèi)存分配,從而修補(bǔ)數(shù)組在程序運(yùn)行期間無法動(dòng)態(tài)改變大小這一缺陷。動(dòng)態(tài)內(nèi)存分配主要用于構(gòu)建鏈表,數(shù),圖等數(shù)據(jù)結(jié)構(gòu)

但指針的操作需要很仔細(xì),稍有疏忽就會(huì)導(dǎo)致程序崩潰。例如當(dāng)我們申明了一個(gè)指針,而沒有及時(shí)初始化,此時(shí)它就是一個(gè)野指針,對野指針指向的位置進(jìn)行讀寫就會(huì)導(dǎo)致程序出錯(cuò),因?yàn)橛锌赡艹绦蜿P(guān)鍵部分被無意修改了。再比如在某個(gè)函數(shù)內(nèi)部動(dòng)態(tài)申請一塊內(nèi)存,但在函數(shù)退出之前卻忘記了及時(shí)的回收它,就會(huì)導(dǎo)致指向那塊內(nèi)存的指針丟失,即程序失去了對那塊內(nèi)存的控制,但那塊內(nèi)存仍然被占用著,如果繼續(xù)重復(fù)執(zhí)行該函數(shù),就會(huì)導(dǎo)致內(nèi)存大量被占用,而無法釋放,直到系統(tǒng)崩潰。還有就是我們動(dòng)態(tài)申請內(nèi)存時(shí),沒有判斷申請是否成功(即判斷是否為NULL),而剛好此時(shí)系統(tǒng)無法提供我們所需的內(nèi)存塊,就直接操作指針,也會(huì)導(dǎo)致程序出錯(cuò)。正是基于這方面的考量,后來許多基于C語言發(fā)展起來的語言(如Java,C#),都舍棄了指針操作。

3 寄存器間接尋址模式簡介

C語言函數(shù)的執(zhí)行都是依賴于棧的,每個(gè)函數(shù)在執(zhí)行之前都需要在棧上開辟一塊屬于自己的空間,這個(gè)空間就是棧幀。這個(gè)棧幀的建立和釋放是依靠編譯器在函數(shù)頭部和尾部添加的一段匯編代碼完成的。這就是任何高級語言編寫的程序在鏈接成為可執(zhí)行程序之前都必須被編譯為匯編語言程序的原因之一。當(dāng)棧幀建立完成后,寄存器ESP指向棧幀的頭部,EBP指向棧幀的尾部,即此時(shí)ESP和EBP分別保存棧幀的頭部和尾部的內(nèi)存地址。隨著數(shù)據(jù)的壓棧和出棧,會(huì)導(dǎo)致棧頂會(huì)不斷變化,即ESP保存的內(nèi)存地址會(huì)不斷變化,而棧底在整個(gè)函數(shù)執(zhí)行期都保持不變,所以EBP可以作為訪問當(dāng)前棧底前后內(nèi)存塊的基準(zhǔn)。例如:movl 0xa,-0x14(%ebp)就表示從EBP指向的內(nèi)存位置向下偏移20個(gè)字節(jié)處開始保存0xa,這就是寄存器間接尋址。

4 分析反匯編代碼

測試代碼如下:

int main(void)

{

int i = 10;

int *p = &i;

*p = 123;

printf("%d\n",*p);

return 0;

}

本次測試的環(huán)境是32位架構(gòu)Ubuntu 4.2.0-42-generic,gcc版本是: 5.2.1 20151010。不同的版本在生成的匯編代碼上可能略有差別,但基本原理是不變的。

對上述代碼進(jìn)行反匯編,在段截取一段與本文相關(guān)的代碼。這是在Linux下的反匯編結(jié)果,所以是AT&T匯編格式。

......

1. movl $0xa,-0x14(%ebp)

2. lea -0x14(%ebp),%eax

3. mov %eax,-0x10(%ebp)

4. mov -0x10(%ebp),%eax

5. movl $0x7b,(%eax)

6. mov -0x10(%ebp),%eax

7. mov (%eax),%eax

8. sub $0x8,%esp

9. push %eax

10. push $0x8048560

11. call 8048330

......

Main函數(shù)執(zhí)行時(shí),其棧幀會(huì)不斷變化,其變化過程如圖1和圖2所示。為了敘述的方便,假設(shè)棧幀-0x14(%ebp)處的內(nèi)存地址為0x12345678,即灰色部分。這11行匯編代碼具體功能詳述如下:

(1)在棧低下方偏移0x14處保存數(shù)字10。

(2)將內(nèi)存地址0x12345678,存入到CPU的寄存器EAX中。

(3)將地址0x12345678存入到-0x10(%ebp)中。

(4)再將地址0x12345678存儲(chǔ)到EAX中。

(5)在地址0x12345678地址處保存0x7b。

(6)將地址0x12345678保存到EAX中。

(7)從地址0x12345678處加載4字節(jié)的數(shù)據(jù)到EAX中。

(8)更新ESP,因?yàn)?0x10(%ebp)和-0x14(%ebp)處這8個(gè)字節(jié)被占用了。

(9)將EAX壓棧,為調(diào)用printf做準(zhǔn)備。

(10)將字符串“%d\n”的地址壓棧。

(11)調(diào)用printf函數(shù)。

簡單來說,就是把某個(gè)需要操作的對象的內(nèi)存地址保存到了棧幀中,當(dāng)需要讀寫該對象時(shí),就把該地址加載到寄存器中,然后通過寄存器間接尋址實(shí)現(xiàn)讀寫。另外,匯編語言中并沒有局部變量這一概念,C語言程序中的局部變量也是通過寄存器間接尋址實(shí)現(xiàn)讀寫的。例如上述匯編代碼的第一句就是通過寄存器間接尋址找到0x12345678這個(gè)內(nèi)存位置,然后寫入數(shù)字10的。

而在嵌入式系統(tǒng)中,需要讀寫大量的寄存器,此時(shí)最好的方法就是通過指針操控它們。要操控這些寄存器的唯一的方法就是通過地址訪問它們,即通過指針讀寫寄存器。跟一般桌面應(yīng)用開發(fā)相比,唯一不同的就是需要先把由CPU廠商提供的寄存器編號強(qiáng)制轉(zhuǎn)換為地址(桌面應(yīng)用開發(fā)中,由于系統(tǒng)保護(hù),不允許直接把一個(gè)整數(shù)強(qiáng)轉(zhuǎn)為地址)。該強(qiáng)轉(zhuǎn)一般是通過宏定義來實(shí)現(xiàn)的,如下所示:

#define GPJ0CON = (*(volatile unsigned int *)0xXXXXXXXX)

然后在程序中就可以像對待普通變量一樣對它進(jìn)行寫入和讀取工作。而在匯編層,依然是寄存器間接尋址,在此不再贅述。因?yàn)樯婕暗酱罅康募拇嫫鞯淖x寫,所以通常的做法就是把大量的與寄存器讀寫有關(guān)的宏定義放在一個(gè)單獨(dú)的文件,便于查找和修改。

5 總結(jié)

指針運(yùn)算就是對寄存器間接尋址的封裝,目的是隱藏匯編層的寄存器,棧幀,棧頂和棧底等復(fù)雜概念,從而為開發(fā)人員提供一個(gè)更加友好,邏輯上更接近人類思維的操作。而寄存器間接尋址依賴的是內(nèi)存地址,即指針運(yùn)算依賴的就是內(nèi)存地址。所以說指針的本質(zhì)就是內(nèi)存地址。則對指針執(zhí)行乘法或除法運(yùn)算在邏輯上是無法說通的,當(dāng)然編譯器也會(huì)報(bào)錯(cuò)。因此指針的合法算術(shù)運(yùn)算只能是加減整數(shù)或兩個(gè)指針相減,這在數(shù)組運(yùn)算別有用。通過指針加減整數(shù)就可以讀寫數(shù)組中不同的元素,但一定要注意不能越界。當(dāng)兩個(gè)指針指向同一個(gè)數(shù)組的不同元素時(shí),可以執(zhí)行指針相減運(yùn)算,得出它們之間相差幾個(gè)元素。理解了指針的本質(zhì)就是內(nèi)存地址之后,對數(shù)組指針,函數(shù)指針,多級指針的理解會(huì)有很大的幫助。

參考文獻(xiàn)

[1][美]K.N.King著.呂秀鋒,黃倩,譯.C語言程序設(shè)計(jì)現(xiàn)代方法(第2版)[M].北京:人民郵電出版社,2010.

[2][美]Richard Blum著.馬朝輝,等譯.匯編語言程序設(shè)計(jì)[M].北京:機(jī)械工業(yè)出版社,2006.

[3]韋東山.嵌入式Linux語言程序開發(fā)完全手冊[M].北京:人民郵電出版社,2008.77-78.

篇3

關(guān)鍵詞:指針變量 數(shù)組 字符串 函數(shù) 常見問題

中圖分類號:TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號:1673-9795(2013)08(b)-0163-01

指針是C語言中廣泛使用的一種數(shù)據(jù)類型。運(yùn)用指針編程是C語言最主要的特點(diǎn)之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu),也能很方便地使用數(shù)組和字符串,更加能像匯編語言一樣處理內(nèi)存地址,[1]從而編寫出精練而高效的程序。

1 指針變量的使用優(yōu)勢及常規(guī)用法

(1)使用指針指向數(shù)組首地址,簡化了數(shù)組相關(guān)的程序內(nèi)容的書寫,避免了整體使用數(shù)組,在程序執(zhí)行中減少了先找數(shù)組元素的地址再取數(shù)組元素內(nèi)容的過程,直接在數(shù)組所在的地址范圍內(nèi)操作數(shù)組元素,提高了程序的執(zhí)行效率。(2)使用指針指向字符串(即字符數(shù)組),把一個(gè)字符串整體當(dāng)作一個(gè)數(shù)組元素,多個(gè)字符串的指針變量就構(gòu)成了指針數(shù)組,不僅節(jié)省了內(nèi)存空間,還大大地提高了程序的執(zhí)行效率。(3)指向單變量的指針變量作為函數(shù)參數(shù),可以在程序執(zhí)行過程中及時(shí)轉(zhuǎn)向調(diào)用函數(shù)的入口。節(jié)省內(nèi)存空間的同時(shí),把指針變量替代單變量作為直接變量在調(diào)用函數(shù)執(zhí)行過程中執(zhí)行相應(yīng)程序操作,免去了返回值的執(zhí)行時(shí)間與過程。(4)指向結(jié)構(gòu)體復(fù)合變量的指針變量作為函數(shù)參數(shù),可以通過變化結(jié)構(gòu)體變量靈活使用指針變量在調(diào)用函數(shù)中執(zhí)行函數(shù)的程序操作,不僅節(jié)省內(nèi)存空間與執(zhí)行時(shí)間,而且方便程序變量的修改,提高了程序的可移植性。(5)指向函數(shù)的指針變量作為函數(shù)的參數(shù),可以在一個(gè)主函數(shù)中實(shí)現(xiàn)多個(gè)自定義函數(shù)功能間的調(diào)用,大大地提高了程序的靈活性與可移植性及程序執(zhí)行的效率。(6)使用指針指向文件類型結(jié)構(gòu)體,可以找到與之相關(guān)的文件,實(shí)現(xiàn)文件的訪問,在主函數(shù)執(zhí)行過程中靈活轉(zhuǎn)向其它文件的執(zhí)行。

2 指針變量使用常見問題及解決方法的探求

2.1 指針變量的初始化

同其他變量的初始化相似,在指針變量的定義之后就應(yīng)該給指針變量賦一個(gè)初始的地址值。如果沒有給定義的指針變量賦初值的話,指針變量的值不定,可能會(huì)導(dǎo)致一些隱藏在某些地址號的內(nèi)存中的難以跟蹤的漏洞(bug)運(yùn)行。如:

int *p; *p=100;

p定義為一個(gè)指向整型變量的指針變量,但是卻沒有給p賦予一個(gè)初始的地址值,只是把一個(gè)存儲(chǔ)100的常量的存儲(chǔ)單元的首地址賦給了p,而這個(gè)存儲(chǔ)單元的首地址可能在程序其它位置另作它用,就會(huì)產(chǎn)生隱形的難以追蹤的bug的運(yùn)行。因此,為了避免可能性的發(fā)生,就要和其他變量的使用一樣,在定義指針變量的時(shí)候就要同時(shí)給予指針變量一個(gè)初值,以確定指針變量的初始的地址,即指針變量的初始化。將上述例子修改為:

int a=100; int *p=&a;

還要注意把“int *p=&a;”和“*p=&a;”混淆,前者是指針變量的初始化語句,即定義的同時(shí)給指針變量賦初值,而后者是一個(gè)旨意錯(cuò)誤的賦值語句,把整型變量a的首地址賦給了p所指向的整型變量。

2.2 指針變量的賦值

給指針變量賦予的初值一定是地址。同樣,在程序中給指針變量重新賦予的值也只能是地址或使指針變量指向同類型的變量值的首地址。如:

int a,*p; p=a;

要使p指向a,就要有地址運(yùn)算符&對a取首地址后賦給p,或者把變量取內(nèi)容賦給p,而不是直接把a(bǔ)賦給p。C語言編譯器會(huì)提示指出這是個(gè)語法錯(cuò)誤,給指針變量賦予的內(nèi)容和指針變量不匹配。正確的賦值一般形式為:

int a,*p; p=&a;

或 int a,*p; *p=a;

還要說明的是指針的指向要有具體類型說明。不能給指針賦予與其基類型不符的地址,否則也會(huì)出現(xiàn)語法上錯(cuò)誤。如:

int a=100; double *p; p=&a;

在給指針賦值時(shí),不只要求是地址,還要是一個(gè)與該指針類型相符的變量或常量的首地址。而上述例子中,a是整型的變量,p是基類型為雙精度型的變量。二者不相匹配,這種賦值在編譯時(shí)就會(huì)發(fā)生語法錯(cuò)誤。因此,給指針變量的賦值要注意指針變量的基類型,即指針變量能夠指向的變量類型。

2.3 指針在函數(shù)之間值的傳遞

#include “stdio.h”

void swap(int *a, int *b)

{int t; t=*a; *a=*b; *b=t;}

void main( )

{int x,y; printf(“請輸入兩個(gè)整數(shù):”);

scanf(&x,&y); printf(“x=%d, y=%d\n”,x,y);

swap(&x,&y); printf(“x=%d, y=%d\n”,x,y);}

函數(shù)間的值傳遞也可以通過實(shí)參的地址單向傳遞給形參的指針變量,直接調(diào)用函數(shù),完成函數(shù)間數(shù)據(jù)傳遞的目的。主函數(shù)main( )在調(diào)用函數(shù)swap( )的同時(shí),把變量x和y的地址分別單向傳遞給了指針變量a和b。也就是主函數(shù)中對整型變量x和y的操作,通過地址的傳遞,雖然在調(diào)用函數(shù)過程中形式上是對指向整型變量x和y的指針變量a和b的內(nèi)容(即x和y)的操作,實(shí)質(zhì)上仍然是繼續(xù)對整型變量x和y調(diào)用函數(shù)的操作。也就沒有必要給主函數(shù)返回x和y的值了。省去了返回的時(shí)間和操作過程,提高了程序的執(zhí)行效率與正確率。

2.4 指向指針變量的指針變量

*p,**p,***p分別叫做一級指針、二級指針和三級指針。如果這樣定義:

int a, *p, **q, ***r;

則第一個(gè)*p中的p可以用來存放普通整型變量的地址,例如賦值:p=&a。第二個(gè)**q中的q可以用來存放整型變量地址的地址,例如指針變量p的地址,p是指針變量,變量的值是整型變量a的地址,那么p這個(gè)指針變量的地址就需要一個(gè)比p高一層的指針來存放。因此可以這樣賦值:q=&p。第三個(gè)***r,道理相同,可以這樣賦值 r=&q。指針的嵌套使用,使程序在執(zhí)行時(shí)更靈活,更有效率。

3 指針的使用是C語言程序設(shè)計(jì)中最重要的一環(huán)

能否正確理解和使用指針是我們是否真正掌握C語言的一個(gè)標(biāo)志。C語言中指針的使用比較靈活,很多人在實(shí)際編程中很容易出錯(cuò),而且這種錯(cuò)誤恰恰又難以發(fā)現(xiàn),所以建議初學(xué)者大量地上機(jī)調(diào)試程序,以弄清一些細(xì)節(jié),并積累經(jīng)驗(yàn),為后續(xù)編程內(nèi)容的學(xué)習(xí)打好堅(jiān)實(shí)的基礎(chǔ)。同時(shí),指針也是C語言中最為困難的一部分,在學(xué)習(xí)中除了要正確理解基本概念,還必須要多編程并上機(jī)調(diào)試。只要做到這些,指針也是不難掌握的。

參考文獻(xiàn)

篇4

關(guān)鍵詞:存儲(chǔ)空間圖;間接尋址;一級指針;二級指針;存儲(chǔ)單元

中圖分類號:TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號:1009-3044(2007)16-31093-03

A Discussion about the Relation of C Language Pointer and Assemble Language Indirect Addressing――Giving Analysis from the Storage Space Digraph

WANG Hai-yan

(Computer Science Department of Suqian College, Suqian 223800, China)

Abstract: C language is a user-oriented procedural language. Pointer is the most flexible part in this language. Assemble language is a language which is processor-oriented and there is no definite conception of pointer, but the similar conception of pointer emergences everywhere. In this paper, it present the application of pointer in assemble language through indirect addressing mode. Depending on the storage space digraph and the relation between pointer of C language and indirect addressing of assemble language, it makes it easier to understand the application and relation between the two languages.

Keywords: Storage Space Digraph; Indirect Addressing; Pointer; Second Rank Pointer; Storage Unit

1 引言

作為最基本的編程語言之一,匯編語言的重要性勿庸置疑,即使是 Linux 程序員有時(shí)也需要使用匯編語言解決實(shí)際問題,理由很簡單:精簡、高效和 libc 無關(guān)性。假設(shè)要移植 Linux 到某一特定的嵌入式硬件環(huán)境下,首先必然面臨如何減少系統(tǒng)大小、提高執(zhí)行效率等問題,此時(shí)或許只有匯編語言能幫上忙了。我們常說匯編語言的抽象是C語言, 而C語言中最靈活是C語言中擁有“指針”這個(gè)數(shù)據(jù)類型。那么匯編語言和C語言中的指針有什么樣的關(guān)系呢?我們也知道在匯編語言中,幾乎所有對內(nèi)存的操作都是對給定地址的內(nèi)存進(jìn)行訪問來完成的,那么在匯編語言中,絕大多數(shù)操作也必然和地址(即指針)產(chǎn)生或多或少的聯(lián)系。匯編語言和CPU以及內(nèi)存,端口等硬件知識(shí)是連在一起的。匯編語言中存儲(chǔ)數(shù)據(jù)的地方不僅有寄存器而且還有存儲(chǔ)單元,更多的數(shù)據(jù)則保存在存儲(chǔ)單元中。因此,對編程人員而言,他肯定迫切地希望訪問內(nèi)存,以保存

更多的數(shù)據(jù),本文將重點(diǎn)闡述訪問數(shù)據(jù)的方式。

2 存儲(chǔ)空間圖的概念

畫一個(gè)圖形,或者觀察一個(gè)圖形,能幫助我們把復(fù)雜的程序設(shè)計(jì)具體化、形象化,有利于掌握程序之間的內(nèi)在聯(lián)系,從而更好的理解程序,激發(fā)大家對程序設(shè)計(jì)語言的興趣。本文用形象的圖形解釋C語言中指針以及匯編語言中間接尋址方式之間的相互關(guān)系。文中運(yùn)用類似于存儲(chǔ)空間圖的方法對兩門語言進(jìn)行解釋。說它類似于存儲(chǔ)空間圖是因?yàn)檫@種圖形沒有用真正二進(jìn)制描述空間的值和空間的地址,姑且我把這種圖形叫做存儲(chǔ)空間圖。

3 兩門語言之間的內(nèi)在聯(lián)系

我們知道在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲(chǔ)器中的,訪問數(shù)據(jù)的方式并不是唯一的。在C語言中訪問單元數(shù)據(jù)有兩種常見方式,一是通過名字直接訪問單元數(shù)據(jù);二是通過指針訪問單元數(shù)據(jù)。直接通過單元名字訪問數(shù)據(jù),兩種語言都很簡單,我在這篇文章中不加以闡述。接下來我就分一級指針和二級指針分別闡述匯編語言和C語言是如何間接訪問內(nèi)存單元數(shù)據(jù),又是以怎樣的形式加以表現(xiàn)的。

3.1 C語言中的一級指針和匯編語言中一次間接尋址的聯(lián)系

3.1.1 C語言中一級指針定義

指針定義形如:數(shù)據(jù)類型 *指針變量,它的存儲(chǔ)空間圖表示如下:

圖1中X就是一級指針,Y是一個(gè)整形變量,X、Y的本質(zhì)區(qū)別在于X單元的值是用于存放內(nèi)存單元的地址,Y單元是存放任意類型的數(shù)據(jù)。X之所以指向Y,是因?yàn)閅單元的地址賦予了X,同時(shí)X所指向的類型和Y同類型。

圖1

3.1.2 匯編語言中的一次間接尋址是指通過寄存器或存儲(chǔ)單元一次間接尋找操作數(shù)。

它的存儲(chǔ)空間圖表示如下:

圖2中si是cpu中的一個(gè)寄存器,si中存放著Y所在單元的地址,Y是一個(gè)單元的名稱,Y單元存放著普通操作數(shù),si之所以指向Y,是因?yàn)閅單元的地址賦予了si。

圖2

圖1、圖2中X和si都是用于存放內(nèi)存單元的地址,我們從中可以得到啟迪,匯編語言中也存在著類似C語言的指針。

3.1.3 以下從編程角度深入探悉二者之間的聯(lián)系。

例1 用C語言指針的方法輸出a單元中的數(shù)據(jù):

main()

{int a=3,*p;

p=&a

printf("%d",*p); 3

}

例2 用間接尋址方法把a(bǔ)單元中的數(shù)據(jù)送往al寄存器中:

data segment

a db 3

data ends

……

lea si, a

mov al, [si]

……

以上程序均是操作存儲(chǔ)單元中的數(shù)據(jù),但都不是通過單元名字操作的。例1用C語言中一級指針的方法,例2用匯編語言中的寄存器間接尋址的方法。那么二者有怎樣的聯(lián)系呢?為了講清楚這個(gè)問題,我把這兩個(gè)程序分別用以下存儲(chǔ)空間圖表示:

圖3 C語言編程的存儲(chǔ)空間圖圖4 匯編語言編程的存儲(chǔ)空間圖

上圖中p和si其實(shí)質(zhì)都是一級指針,在C語言中是用指針指向的內(nèi)容,即用*p的形式來取得單元的數(shù)據(jù),而匯編語言是通過寄存器一次間接尋址方式來取得單元內(nèi)容,當(dāng)然這都要求指針p和寄存器si首先獲得單元的地址。(p=&a/lea si, a)。

3.2 C語言中的二級指針和匯編語言中二次間接尋址的聯(lián)系

3.2.1 C語言中二級指針的定義。

指針定義形如:數(shù)據(jù)類型 **指針變量,它的存儲(chǔ)空間圖表示如下:

圖5中X相對與Z這個(gè)變量是二級指針,它和一級指針的區(qū)別在于X這個(gè)指針?biāo)赶虻膬?nèi)容仍然是某個(gè)單元的地址(圖中是Z單元的地址)。要想輸出Z單元的內(nèi)容,則需要通過兩次指向才能完成。

圖5

3.2.2 匯編語言中二次間接尋址是指通過寄存器或存儲(chǔ)單元兩次間接尋找操作數(shù)。

它的存儲(chǔ)空間圖表示如下:

圖6中si其實(shí)就等價(jià)于圖5中定義的X,都是二級指針。但在匯編語言中si是一個(gè)指針寄存器,無論是作為一級指針還是作為二級指針,我們在使用的時(shí)候都是不需要定義的。事實(shí)上匯編語言中根本沒有一級指針和二級指針的定義,也就是說匯編語言中沒有C語言中定義上的繁瑣,但你仍可以用C語言的思想來解釋匯編語言中的指針問題。

圖6

3.2.3 以下從編程角度深入探悉二者之間的聯(lián)系。

例3 輸出以下字符串

main()

{char *p[] = {"ab", "cd", "ef"};

char **sp = p;

int i;

for(i=0; i

printf("%s", **(sp+i));

}

圖7 C語言編程的存儲(chǔ)空間圖

例4 累加數(shù)組array中元素和的程序段

data segment

array dw 10,20,30,40,50,60,70,80,90,100

count dw 10

sum dw?

table dw 3 dup(?);地址表

data ends

code segment

main proc far

assume cs:code, ds:data

start:push ds

……

mov table, offset ary

mov table+2, offset count

mov table+4, offset sum

mov bx, offset table

call proadd

ret

main endp

proadd procnear

……

mov si, [bx]

mov di, [bx+2]

mov cx, [di]

mov di, [bx+4]

xor ax, ax

next: add ax, [si]

add si, 2

loop next

mov [di], ax

……

proadd endp

code ends

end start

圖8 匯編語言編程的存儲(chǔ)空間圖

以上程序均是通過兩次操作才找出單元中的數(shù)據(jù),前者是用C語言中二級指針二次指向的方法,后者是用匯編語言中的兩次間接尋址的方法尋找操作數(shù)。從上圖可知這兩門語言的內(nèi)在聯(lián)系,即兩門語言最終都是通過指針兩次尋址來訪問操作數(shù)。所不同的是:前者是二級指針的概念,后者是兩次間接尋址。這種本質(zhì)相同,只是語言描述上有所不同的概念,從存儲(chǔ)空間圖的視角可以幫助我們更好的理解他們之間的聯(lián)系。

依此類推,對于多級指針的學(xué)習(xí),我們也可以借助存儲(chǔ)空間圖來幫助我們更好的分析程序,理解程序,對于一些復(fù)雜的問題給予簡化,對于不同語言之間的關(guān)系我們也能進(jìn)行更好的深入思考。

4 結(jié)束語

本文通過存儲(chǔ)空間圖深入淺出的探悉了兩門語言在尋找數(shù)據(jù)方面的聯(lián)系??梢哉fC語言的指針和匯編語言的尋址方式一直困擾著很多編程者,尤其對二級指針、二次間接尋址的理解及運(yùn)用更加困難。文中的例題均以最簡單的題型來說明這些深?yuàn)W的道理,而且從存儲(chǔ)空間圖的視角分析了二者之間的聯(lián)系。相信這篇文章,不僅能幫助我們運(yùn)用存儲(chǔ)空間圖解釋問題、分析問題,而且能幫助我們更好的思考不同語言之間的聯(lián)系,更好的去思考程序設(shè)計(jì)。

參考文獻(xiàn):

[1] 裘宗燕. C++程序設(shè)計(jì)語言(特別版). 北京機(jī)械工業(yè)出版社, 2002.7.

[2] Standley B.lippman. C++ Primer中文版. 人民郵電出版社,20006.3.

[3] 譚浩強(qiáng). C程序設(shè)計(jì)(第二版). 清華大學(xué)出版社出版,2005.6.

[4] 錢能. C++程序設(shè)計(jì)教程. 清華大學(xué)出版社, 2005.5.

[5] 沈美明. IBM PC匯編語言程序設(shè)計(jì). 清華大學(xué)出版社,1993.9.

篇5

1.指針的定義

指針定義格式如下:

類型關(guān)鍵字 *指針變量名

2.用指針表示變量

例1:

int*p;

int a;

p=&a;

“*”是乘號,又可以定義指針,還可以取指針?biāo)赶虻淖兞康膬?nèi)容。

#include

void main()

{

int *p,a;

int count=19;

p=&count;

a=*p;

printf("%d\n",a);

printf("%d\n",*p);

}

“*”放在可執(zhí)行語句中的指針之前,表示取指針?biāo)赶虻淖兞康膬?nèi)容。

“*”放在指針定義中時(shí),稱指針定義符。

該程序運(yùn)行結(jié)果如下:

19

19

3.用指針表示數(shù)組元素

例2:

int*p,*q;

int a[10];

p=a;

q=a[2];

#include

void main()

{

int a[5]={1,2,3,4,5};

int *p=a;

for(p=a;p

{

printf("%d",*p);

}

printf(“\n”) ;

}

該程序運(yùn)行結(jié)果如下:

12345

該例中輸出的每個(gè)數(shù)組元素都是一個(gè)整型數(shù)。

#include

void main()

{

char a[]="ABCDE";

char *p=a;

for(p=a;p

{

printf("%c",*p);

}

printf("\n") ;

}

該程序運(yùn)行結(jié)果如下:

ABCDE

該例中輸出的每個(gè)數(shù)組元素都是一個(gè)字符。

4.用指針表示字符串

#include

void main()

{

char *p,s[]="abcdefgh";

p=s;

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

p=s+1;

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

printf("%c\n",*p);

}

該程序運(yùn)行結(jié)果如下:

abcdefgh

bcdefgh

b

使用格式控制符%s,輸出字符指針(即p)來輸出字符串。

使用格式控制符%c,輸出字符指針的間接(即*p)引用來輸出字符。

同樣的例子如下:

#include

void main()

{

char *p,s[]="abcdefgh";

p=s;

while(*p!='\0')

{

printf("%c",*p);

p++;

}

printf("\n");

p=s;

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

p=s+1;

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

}

該程序運(yùn)行結(jié)果如下:

abcdefgh

abcdefgh

bcdefgh

#include

void main()

{

char a[]=”ABCDE”;

char *p=NULL;

for(p=a;p

{

printf(“%s\n”,p);

}

}

該程序運(yùn)行結(jié)果如下:

ABCDE

BCDE

CDE

DE

E

#include

void main()

{

char a[]=”ABCDE”;

char *p=NULL;

for(p=a;p

{

printf(“%c”,*p);

}

}

該程序運(yùn)行結(jié)果如下:

ABCDE

5.指針數(shù)組與指向數(shù)組的指針

指針數(shù)組就是數(shù)組元素為指針的數(shù)組。常用的指針數(shù)蘇是一維一級指針數(shù)組,即數(shù)組是一維的,元素是一級指針。

指針數(shù)組定義的格式如下:

類型說明 *數(shù)組名[大小] 例如:int*ap[5];ap是一維一級指針,該數(shù)組有5個(gè)元素,每個(gè)元素是一個(gè)一級指針。

在實(shí)際應(yīng)用中,常常使用一維一級指針數(shù)組來存放若干個(gè)字符串,這樣操作起來比較方便。

例:編程實(shí)現(xiàn)輸入星期幾的數(shù)字后,輸出該數(shù)字對應(yīng)的英文全名。

#include

char *name[]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};

main()

{

int week;

while(1)

{

printf("Enter week No.:");

scanf("%d",&week);

if(week7) break;

printf("Week No. %d is %s\n",week,name[week]);

}

}

該程序中指針數(shù)組name經(jīng)初始化后有8個(gè)元素,name[0]不用,name[1]指向Monday,name[2]指向Tuesday …… 。

指向數(shù)組的指針,定義格式為:

int(*p)[4] 定義了一個(gè)指針,該指針指向二維數(shù)組,此二維數(shù)組每行有4個(gè)元素。

#include

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

main()

{

int (*p)[4];

p=a+2;

printf("%3d %3d %3d\n",p[0][0],p[1][1],p[-1][2]);

}

該程序運(yùn)行結(jié)果如下:

907

6.用指針表示結(jié)構(gòu)體成員

#include

void main()

{

structperson{charname[9];intage;};

structpersonclass[10] = { "John",17,

"Paul",19,

"Mary",18,

"Adam",16,},*p;

p=class+2;

printf("%c\n",p->name[0]);

}

該程序運(yùn)行結(jié)果如下:

M

#include

struct tt

{int x; struct tt*y;}*p;

struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a};

main()

{int i;

p=a;

for(i=1;i

{ printf(“%d ”,p->x);

p=p->y;

}

}

該程序運(yùn)行結(jié)果如下:

20 15

首先,指針p指向數(shù)組a的首地址,a[0]。在循環(huán)中,i=1時(shí),因此時(shí)p指向a[0],因此p->x的值是20。a[0]的第二個(gè)成員表示為p->y,此值為a+1,即a[1]的地址,也就是把這個(gè)值更新了指針p,i=2時(shí),p->x即為a[1]的成員x的值15。

本文主要?dú)w納了C語言中指針的基本用法,熟練地掌握指針的基本用法,為指針在程序中的應(yīng)用打下一個(gè)良好的基礎(chǔ)。在以后的文章中將詳細(xì)介紹指針在程序中的應(yīng)用。

參考文獻(xiàn):

篇6

關(guān)鍵詞:C語言;指針;數(shù)組

中圖分類號:TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號:1009-3044(2010)19-5228-01

Studying the Pointer and Array Problem of C Language

LIU Wen-feng

(Computer and Information Engineering Department, Heze University, Heze 274015, China)

Abstract: Using examples and pointing the two highlights,this paper sdudys the pointer and array in solving some issues ,there is some degree equivalence; This paper has some guidance to the different levels and types of the C language developer.

Key words: C language; pointer; array

C語言課程,是計(jì)算機(jī)科學(xué)與技術(shù)以及相關(guān)學(xué)科專業(yè)的一門專業(yè)基礎(chǔ)課。該課程學(xué)習(xí)掌握的好壞對后繼課程有著非常重要的影響,而C語言課程中有兩天非常重要的部分,一個(gè)是數(shù)組,另一個(gè)是指針。數(shù)組有一維數(shù)組、二維數(shù)組等,學(xué)生理解相對容易,寫程序也很容易上手。而指針則是C語言課程中最難學(xué)習(xí)和掌握的內(nèi)容,雖然花費(fèi)了大量的時(shí)間,但是也很難熟練運(yùn)用。

1 結(jié)合實(shí)例剖析指針和數(shù)組的特點(diǎn)

下面我們給出實(shí)例來剖析指針和數(shù)組的特點(diǎn),在主函數(shù)中間填寫一部分語句或使用單獨(dú)的函數(shù)以實(shí)現(xiàn)以下功能,求出1到1000之內(nèi)能被7或11整除但不能同時(shí)被7和11整除的所有整數(shù)并存放在數(shù)組aa中,并把滿足條件的值存入OUT.DAT中(我們事先已經(jīng)在相應(yīng)的目錄建好了一個(gè)空的記事本文件,文件名為OUT,擴(kuò)展名改為.DAT格式),同時(shí)輸出到執(zhí)行屏幕上,我們使用兩種方式分別加以實(shí)現(xiàn)。

1.1 基于指針的實(shí)現(xiàn)方法

首先使用指針來實(shí)現(xiàn)該函數(shù)的功能。

#include

#include //使用到的頭文件

void writeDAT();//聲明寫函數(shù)

void countValue(int *a,int *n);//聲明編寫函數(shù),變量均使用指針

void main()

{ int aa[1000],n,k;//定義所需變量

system("CLS");//清楚屏幕內(nèi)容

countValue(aa,&n);//轉(zhuǎn)入countValue執(zhí)行

for(k=0;k

if((k+1) %10 ==0)

{printf("%5d",aa[k]);

printf("\n"); }

else printf("%5d",aa[k]);/*以上for語句是實(shí)現(xiàn)結(jié)果的屏幕輸出*/

writeDAT();/*執(zhí)行輸出語句的函數(shù)*/}

void writeDAT()//寫函數(shù)的具體實(shí)現(xiàn)

{ int aa[1000],n,k;

FILE *fp;//使用文件指針

fp=fopen("out.dat","w");//以寫方式打開文件out.dat

countValue(aa,&n);//再執(zhí)行一次countValue函數(shù)

for(k=0;k

if((k+1)%10==0)

{ fprintf(fp,"%5d",aa[k]);

fprintf(fp,"\n"); }

else fprintf(fp,"%5d",aa[k]);/*以上for語句是實(shí)現(xiàn)aa中的數(shù)據(jù)寫入文件out.dat中,每行顯示10個(gè) */

fclose(fp);//關(guān)閉所打開的文件

}

以下是使用指針對函數(shù)countValue的具體實(shí)現(xiàn)。

void countValue(int *a,int *n) /*定義傳遞指針變量a為數(shù)組指針和n統(tǒng)計(jì)滿足條件的個(gè)數(shù)指針*/

{ int i;

*n=0; //對指針變量所指內(nèi)容賦初值

for(i=1;i

{if((i%7==0 && i%11!=0)||(i%7!=0 && i%11==0))/*如果i的值滿足能被7整除同時(shí)又不能被11整除;或者i的值滿足不能被7整除同時(shí)必須能被11整除。滿足這兩個(gè)條件之一即符合條件*/

{*a++=i;*n=*n+1;}}}

語句*a++=i,可以分為兩句來實(shí)現(xiàn)。即*a=i,a=a+1;語句*a=i是把變量i的值存入指針a所指地址的變量空間中;語句a=a+1指的是指針變量a指向下一個(gè)數(shù)據(jù)單元。

1.2 基于數(shù)組的實(shí)現(xiàn)方法

以下是數(shù)組的實(shí)現(xiàn)方法。

#include

#include //使用到的頭文件

void main()

{ FILE *fp;//定義文件類型指針

int i,aa[1000],n=0,k; //定義所需變量

system("CLS");//清楚屏幕內(nèi)容

for(i=1;i

{if((i%7==0 && i%11!=0)||(i%7!=0 && i%11==0))/*如果i的值滿足能被7整除同時(shí)又不能被11整除;或者i的值滿足不能被7整除同時(shí)必須能被11整除。滿足這兩個(gè)條件之一即符合條件*/

{aa[n]=i;n++;}}//把滿足條件的數(shù)據(jù)存入數(shù)組aa中,個(gè)數(shù)n值增1

for(k=0;k

if((k+1) %10 ==0)

{printf("%5d",aa[k]);

printf("\n"); }

else printf("%5d",aa[k]); //以上for語句是實(shí)現(xiàn)把結(jié)果輸出到屏幕上

fp=fopen("out.dat","w");//以寫方式打開文件out.dat

for(k=0;k

if((k+1)%10==0)

{ fprintf(fp,"%5d",aa[k]);

fprintf(fp,"\n");

}else fprintf(fp,"%5d",aa[k]); /*以上for語句是實(shí)現(xiàn)aa中的數(shù)據(jù)寫入文件out.dat中,每行顯示10個(gè) */

fclose(fp); //關(guān)閉所打開的文件

}

數(shù)組實(shí)現(xiàn)相對較簡單,也很容易理解和掌握。這種方法沒有使用單獨(dú)的函數(shù),由于該函數(shù)簡單,直接放到主程序當(dāng)中來實(shí)現(xiàn),當(dāng)然也沒有用到參數(shù)傳遞。避免了在參數(shù)使用和參數(shù)傳遞中的不必要的錯(cuò)誤。

這兩種方法,前一種方法使用參數(shù)傳遞,在參數(shù)傳遞和地址傳遞中,指針有其非常優(yōu)越的特性,利用指針我們實(shí)現(xiàn)了相應(yīng)功能。但在具體使用中,雖然語句較少,指針在理解和學(xué)習(xí)過程中相對復(fù)雜。如在函數(shù)中的參數(shù)傳遞過程中,對整型變量n的傳遞使用的是變量n的地址&n,而不是n本身;對數(shù)組aa[1000]在函數(shù)傳遞中使用整型指針a,而不是*a或&a。

2 結(jié)束語

目前很多已經(jīng)成型的編程專家,在很多情況下都不使用指針,特別是在大型軟件程序的開發(fā)中。因?yàn)橹羔樂浅l`活和方便,在具體使用中很容易出現(xiàn)引用錯(cuò)誤和指向錯(cuò)誤的問題,與此同時(shí)這些錯(cuò)誤在調(diào)試和測試中又是很難被發(fā)現(xiàn)的。數(shù)組雖然沒有指針靈活,但我們可以實(shí)現(xiàn)與指針相同的效果,例如很多國外的編程專家都不使用指針,而使用數(shù)組來替代它。這樣就避免了很多不必要的麻煩。也不是說大家都不要學(xué)習(xí)指針了,都來學(xué)數(shù)組。如果你是軟件開發(fā)的新手,建議少使用指針,當(dāng)然如果你是多年的編程專家并且對C語言掌握的非常透徹,指針當(dāng)然是較好的選擇。

參考文獻(xiàn):

[1] 李明輝,丁海艷,萬克星,等.全國計(jì)算機(jī)等級考試上機(jī)考試題庫――三級網(wǎng)絡(luò)技術(shù)[M].成都:電子科技大學(xué)出版社,2008.

[2] 譚浩強(qiáng).C語言程序設(shè)計(jì)教程[M].3版.北京:高等教育出版社,2006.

篇7

關(guān)鍵詞:C++語言程序設(shè)計(jì);函數(shù)指針;分析研究

中圖分類號:TP311.11 文獻(xiàn)標(biāo)識(shí)碼:A文章編號:1007-9599 (2011) 24-0000-01

Analysis and Research of Function Pointers for C++ Language Programming

Zhang Suxia

(Shandong Rural Credit Cooperatives,Qingdao266550,China)

Abstract:Pointer as C++ language programming is an important concept,its application is the C++ Programming Language is very important content.Pointer as a special type of data structure,which can effectively express complex data between the logical structure of the relationship.Flexible and correctly use the pointer to the design of the program with a lot of convenience,the application of which the most significant effect is a function pointer,by using the function pointer,you can call the function can get multiple return values,and to deal directly with memory addresses and so on.This article from the introduction of C++ language program design,function pointer to talk about,and then a detailed description of the use of C++ language program design function pointers need to pay attention to the,the final C++ language program design,function pointers application techniques carried out a systematic analysis.

Keywords:C++ Language Programming;Function pointer;Analysis

一、認(rèn)識(shí)C++語言程序設(shè)計(jì)中的函數(shù)指針

(一)指針與函數(shù)。在C++語言程序設(shè)計(jì)中,將指針與函數(shù)結(jié)合在一起使用具有非常豐富的內(nèi)涵。比如說,可以把指針作為函數(shù)的參數(shù)來使用,也可以把指針作為函數(shù)的返回值,另外,指針可以指向函數(shù)成為函數(shù)指針等。在C++語言程序設(shè)計(jì)中,用指針作函數(shù)的參數(shù),從而實(shí)現(xiàn)地址傳參的調(diào)用。而所謂的調(diào)用就是系統(tǒng)自動(dòng)將實(shí)參地址的值賦給其所對應(yīng)的形參指針,從而使形參指針指向?qū)嶋H參數(shù)變量。這樣一來,形參在函數(shù)體內(nèi)的變化,將會(huì)直接影響到調(diào)用函數(shù)中與之對應(yīng)的實(shí)參的值。

(二)區(qū)別指針函數(shù)與函數(shù)指針的概念。由于函數(shù)的類型是按照函數(shù)返回值的類型來定義的,所以把返回值為指針類型的函數(shù)稱為指針函數(shù)。其中需要說明的是如果使用某變量的地址來充當(dāng)函數(shù)的返回值的話,還需要考慮地址所對應(yīng)的變量空間是否還在被占用,若地址空間已經(jīng)被釋放掉,那么其中的數(shù)據(jù)就有可能發(fā)生了變化,這樣的話就需要將相應(yīng)的變量設(shè)置為靜態(tài)變量,否則的話,就不能實(shí)現(xiàn)正確傳遞參數(shù)的效果。還有一點(diǎn)要說明的就是在使用指針函數(shù)時(shí),必須把接收函數(shù)值的變量設(shè)置為指針,而且其數(shù)據(jù)類型必須與返回值的數(shù)據(jù)類型相同。

由于指針變量不僅可以指向不同的數(shù)據(jù)類型,同時(shí)還可以指向函數(shù),其中把指向函數(shù)入口地址的指針稱為函數(shù)指針。函數(shù)指針作為C++語言程序設(shè)計(jì)中函數(shù)與指針結(jié)合應(yīng)用的一個(gè)重要概念,函數(shù)指針的作用就是用來在函數(shù)間進(jìn)行函數(shù)參數(shù)的傳遞。

在C++語言程序設(shè)計(jì)中常常會(huì)把指針函數(shù)與函數(shù)指針兩個(gè)概念混淆起來,實(shí)際上,明白二者的實(shí)質(zhì)后,二者完全是兩個(gè)不同的概念,其最為顯著的區(qū)別就在于函數(shù)指針中的指針是指向函數(shù)入口的,而指針函數(shù)中的指針是指向函數(shù)出口的,所以在使用時(shí)一定要把握好二者的區(qū)別,正確使用。

二、使用C++語言程序設(shè)計(jì)函數(shù)指針需要注意的問題

盡管函數(shù)指針的使用可以為程序設(shè)計(jì)帶來很多的方便,但是由于指針變量自身存在的缺陷,所以在使用中如果不小心的話就會(huì)出現(xiàn)錯(cuò)誤,嚴(yán)重的話就可能導(dǎo)致系統(tǒng)的崩潰,所以這里有必要就C++語言程序設(shè)計(jì)函數(shù)指針應(yīng)用中經(jīng)常出現(xiàn)的問題進(jìn)行說明。

第一、指針變量初始值的賦值問題。盡管指針變量是指向的是相應(yīng)數(shù)據(jù)變量的存儲(chǔ)地址,但是在使用該指針變量前必須對指針變量的初值進(jìn)行賦值,如果不對其賦值的話,系統(tǒng)就會(huì)隨機(jī)對其進(jìn)行賦值,顯然,這就會(huì)導(dǎo)致比較嚴(yán)重的錯(cuò)誤。

第二、指針變量所指對象的存儲(chǔ)單元單元分配問題。在對指針變量所指的對象進(jìn)行賦值時(shí)需要為其所指的對象分配充足的存儲(chǔ)單元,如果存儲(chǔ)單元分配不足的話也將會(huì)發(fā)生一系列的錯(cuò)誤。

第三、在操作前不對指針的值是否為空就進(jìn)行操作的問題。對于一個(gè)值為空的,它的值為空的指針類型變量而言,它是不指向任何變量的,如果強(qiáng)制對它進(jìn)行操作的話,就可能會(huì)出現(xiàn)如下的幾種情況:一是禁止讀寫;二是只允許讀而不允許寫;三是既允許讀又允許寫的三種不合法的存儲(chǔ)區(qū)域賦值問題,顯然,這一問題所造成的錯(cuò)誤勢必會(huì)非常嚴(yán)重。

第四、函數(shù)按地址引用時(shí)參數(shù)的誤用問題。函數(shù)參數(shù)的引用包括按值引用和按地址引用兩種不同的引用方式,其中按值引用的是數(shù)值而按地址引用的是地址,二者是不一樣的,一定要區(qū)分開來,不能混淆。

三、C++語言程序設(shè)計(jì)中函數(shù)指針的應(yīng)用技巧分析

函數(shù)指針作為一種具有特殊用途的指針,它廣泛的應(yīng)用于C++語言程序設(shè)計(jì)中。其中C++語言程序設(shè)計(jì)中的函數(shù)指針主要用于調(diào)用函數(shù)以及充當(dāng)函數(shù)的參數(shù)這兩個(gè)方面。而C++語言程序設(shè)計(jì)中函數(shù)指針的應(yīng)用是有技巧的,其使用技巧如下:

第一、多態(tài)機(jī)制的實(shí)現(xiàn)。在C++語言程序設(shè)計(jì)中使用函數(shù)指針來實(shí)現(xiàn)多態(tài)機(jī)制是比較復(fù)雜的,其中主要是通過虛函數(shù)表來實(shí)現(xiàn)的,其中虛函數(shù)表中存放的就是由函數(shù)指針組成的數(shù)組,由這些函數(shù)指針來指向?qū)嶋H所要調(diào)用的函數(shù)。

第二、回調(diào)函數(shù)。所謂的回調(diào)函數(shù)可以這樣的來理解,如果把某個(gè)函數(shù)的指針作為參數(shù)將其傳遞給另一個(gè)函數(shù)時(shí),當(dāng)這個(gè)指針用來指向函數(shù)時(shí),就是回調(diào)函數(shù)。在C++語言程序設(shè)計(jì)中回調(diào)函數(shù)應(yīng)用的比較廣泛,舉個(gè)例子,譬如Win32程序設(shè)計(jì)中的WinProc其實(shí)就是一種回調(diào)函數(shù),它主要是用來處理窗口的相關(guān)消息。

第三、取代分支語句。分支語句在程序維護(hù)上往往具有一定的限制,然而函數(shù)指針的應(yīng)用可以很好的解決這一問題。

參考文獻(xiàn):

[1]張海平.C/C++語言中函數(shù)指針的深入分析與應(yīng)用[J].軟件開發(fā)與設(shè)計(jì),2009(22)

篇8

下咽癌是一種惡性腫瘤,原發(fā)于喉部以外的喉咽或者下咽部,臨床上的發(fā)病率不高,對其影響報(bào)道因而不多,我院對收治的38例下咽癌患者的臨床資料進(jìn)行回顧性分析,所有病例都經(jīng)手術(shù)及其局部穿刺病理證實(shí),對CT應(yīng)用于下咽癌的鑒別與診斷進(jìn)行探討,具體報(bào)告如下。

1 資料與方法

1.1一般資料

本文資料選擇我院自2003-2010年所收治的下咽癌患者共38例,其中男34例,女4例,年齡37-70歲,平均年齡55.4±2.3歲,臨床上的癥狀表現(xiàn)為,咽部出現(xiàn)異物感患者18例,吞咽困難患者17例,聲音嘶啞患者22例,咽喉部疼痛患者23例,頸部包塊患者13例,4例患者伴隨呼吸困難,以上所有病例均經(jīng)過手術(shù)及局部穿刺病理證實(shí),其中經(jīng)手術(shù)患者20例,鱗狀上皮細(xì)胞癌是其主要病理特征,其中有13例高分化的鱗狀上皮細(xì)胞癌,11例中分化鱗狀上皮細(xì)胞癌,7例低分化鱗狀上皮細(xì)胞癌,5例中至高分化鱗狀細(xì)胞癌,3例低至中分化鱗狀細(xì)胞癌。

1.2方法

CT掃描儀選擇Siemens Somatom Plus或者Somatom Plus4全身掃描儀,其掃描平面需要與硬腭平行,舌骨平面到環(huán)狀軟骨下緣,為掃描儀掃描范圍,層厚度為5mm,視為連續(xù)掃描,若為螺旋掃描,層厚應(yīng)為5mm,螺距應(yīng)為1,其中28例需要行增強(qiáng)掃描。

1.3統(tǒng)計(jì)學(xué)方法

應(yīng)用SPSS10.0軟件包對其資料進(jìn)行統(tǒng)計(jì)學(xué)處理分析。

2 結(jié)果

2.1下咽癌具體分型分析

依據(jù)病灶位置及其下咽解剖結(jié)構(gòu)分析,本組病例分為,下咽上區(qū)癌(圖1、2)其病灶主要位于會(huì)厭前間隙與會(huì)厭舌面,舌骨與會(huì)厭間,表現(xiàn)為軟組織腫塊,其中明顯有4例腫塊較大,占據(jù)會(huì)厭前間隙,同時(shí)侵犯口底、舌根部,另有5例伴隨著頸部淋巴結(jié)轉(zhuǎn)移,梨狀窩癌(圖3-6),發(fā)生于左側(cè)14例,發(fā)生右側(cè)12例,咽后壁癌或者環(huán)后癌(圖7-9),共有5例,有3例患者為咽后壁癌,2例環(huán)后癌,混合型癌患者3例。

2.2下咽癌患者CT具體診斷

病變部位,位于會(huì)厭舌面的腫塊有4例患者,梨狀窩患者26例,下咽后壁患者3例,環(huán)后區(qū)2例,混合型3例,梨狀窩,環(huán)后區(qū)及其咽后壁為腫塊的廣泛侵入部位,沿黏膜與病灶表現(xiàn)為浸潤性生長,也隨之會(huì)形成不規(guī)則腫塊,同周圍的結(jié)構(gòu)組織界限不夠明晰。病變的密度,通過平掃發(fā)現(xiàn)為等或者低密度,其密度同頸動(dòng)脈鞘內(nèi)的血管密度相一致,不過略低于雙側(cè)下頜下腺及其胸鎖乳突肌的密度,同時(shí)其密度與口底舌肌區(qū)別明顯,通過增強(qiáng)掃描發(fā)現(xiàn)腫塊出現(xiàn)顯著的不均勻強(qiáng)化,且梨狀窩出現(xiàn)變窄或者消失現(xiàn)象,咽后組織明顯增厚,喉鄰近結(jié)構(gòu)受累,腫瘤波及喉與喉旁結(jié)構(gòu),出現(xiàn)了聲門裂變形,旋轉(zhuǎn)或者轉(zhuǎn)移,喉軟骨也發(fā)生破壞,同時(shí)頸部淋巴結(jié)轉(zhuǎn)移,食管與其他結(jié)構(gòu)明顯受累,食管壁增厚,出現(xiàn)軟組織腫塊。

3 討論

所謂下咽即為喉咽,部位在4-6頸椎前,喉的兩旁及其后方,上界與會(huì)厭平,下界環(huán)狀軟骨下緣平,下部與食管連接,其黏膜面包含會(huì)厭舌面與舌根下部,下咽側(cè)壁與后壁。下咽可分為四區(qū),其一為下咽上區(qū),其包括會(huì)厭舌面,會(huì)厭溪與舌根,其二為梨狀窩區(qū),分別位于左右,上界是為舌會(huì)厭側(cè)皺襞,舌甲膜為外側(cè)上部,甲狀軟骨翼板[1]。其三為下咽后壁區(qū),上部為會(huì)厭,下部為環(huán)咽肌間下咽后壁。其四為環(huán)后區(qū),從上到下依次為環(huán)杓關(guān)節(jié)面,環(huán)狀軟骨下緣,前后壁依次為,環(huán)狀軟骨后黏膜與椎前黏膜。

下咽癌其屬于喉癌,一般分為喉內(nèi)喉外,喉內(nèi)癌一般限于喉內(nèi),發(fā)展較為緩慢,擴(kuò)散也較為晚,另喉外癌則則是起源于喉的下咽,生長快,轉(zhuǎn)移較早,依據(jù)1961年的第七屆國際耳鼻咽喉會(huì)議[2],其將下咽癌分出單列。

對于下咽癌來說,普遍較為少見,據(jù)國內(nèi)統(tǒng)計(jì),在全身惡性腫瘤中僅占據(jù)0.15%-2.2%,普遍來說分為梨狀窩癌,其占75%-87%,下咽后壁癌則占5%-22%[3],下咽上區(qū)癌占9%,梨狀窩癌普遍容易在黏膜下浸潤性生長,甲狀軟骨板后部逐漸被其侵犯,向上侵犯舌根部,向內(nèi)侵入喉部與喉旁間隙,出現(xiàn)了喉旁間隙增寬現(xiàn)象,密度明顯升高,聲帶出現(xiàn)右側(cè)移位,淋巴結(jié)轉(zhuǎn)移,轉(zhuǎn)移至頸內(nèi)靜脈淋巴結(jié)。

通過本文結(jié)果分析,下咽癌頸部淋巴結(jié)發(fā)生轉(zhuǎn)移的可能性較高,據(jù)相關(guān)文獻(xiàn)報(bào)道高達(dá)50%,本組為78.2%[4],其中聲帶發(fā)生轉(zhuǎn)移的情況較少見,而聲門上型癌與跨聲門癌發(fā)生轉(zhuǎn)移的情況較多,此為CT診斷的結(jié)果,更加清晰地顯示了腫瘤的部位,顯示了黏膜面的情況還有喉內(nèi)侵犯的情況,特別是對腫瘤的侵犯范圍,CT檢查更加準(zhǔn)確,其中包括對喉軟骨、聲門旁間隙與會(huì)厭前間隙,診斷鑒別都較高[5]。且通過CT診斷可以區(qū)分下咽癌與喉癌,兩者雖病變部位較為接近,但在CT診斷下,下咽癌是發(fā)生于喉的兩側(cè)或者下方,而喉癌也不同,為發(fā)生于喉腔粘膜的惡性腫瘤。這是CT診斷的兩者差別。

通過本文分析,下咽癌通過CT檢查診斷,還是較為準(zhǔn)確的,值得臨床上的廣泛推廣使用。

參 考 文 獻(xiàn)

[1]屠規(guī)益.現(xiàn)代頭頸腫瘤外科學(xué)[M].北京:科學(xué)出版社,2004,594.

[2]黃選兆,汪吉寶.實(shí)用耳鼻眼科學(xué)[M].北京:人民衛(wèi)生出版社,1998,398-402.

[3] 周蓉先,羅建天,李逸塵. 喉咽癌的咽-食道鋇劑造影和CT掃描檢查. 復(fù)旦學(xué)報(bào),2009,30:269.

篇9

【關(guān)鍵詞】 抗CCP抗體;RF因子;類風(fēng)濕關(guān)節(jié)炎;應(yīng)用價(jià)值

類風(fēng)濕關(guān)節(jié)炎(RA)以慢性關(guān)節(jié)炎性反應(yīng)為主要表現(xiàn), 是一種結(jié)締組織病。如果不及時(shí)給予恰當(dāng)治療, 將會(huì)引發(fā)不可逆轉(zhuǎn)的骨關(guān)節(jié)破壞。因此早期確診利于控制病情、改善預(yù)后具有重要意義。鄭州市第九人民醫(yī)院對118例RA及85例非RA患者的血清抗CCP抗體、RF進(jìn)行檢測, 探討二者聯(lián)合檢測對RA診斷的價(jià)值, 現(xiàn)報(bào)告如下。

1 資料與方法

1. 1 一般資料 ①RA組:本組118例均為2009年7月~2013年7月于本院就診的RA患者, 男45例, 女73例, 年齡21~83歲, 平均(42.2±12.5)歲, 均符合1987年美國風(fēng)濕病協(xié)會(huì)修訂的關(guān)于RA分類的診斷標(biāo)準(zhǔn)。②非RA組:本組85例均為同期于本院就診的其他自身免疫性疾病患者, 男36例, 女49例, 年齡在18~79歲, 平均(39.7±12.1)歲, 其中系統(tǒng)性紅斑狼瘡(SLE)26例、骨性關(guān)節(jié)炎(OA)19例, 強(qiáng)直性脊柱炎(AS)13例、硬皮病9例、干燥綜合征(SS)8例, 混合性結(jié)締組織?。∕CTD)5例, 皮肌炎3例, 血管炎2例。兩組在性別、年齡、患病類型、臨床表現(xiàn)等方面差異無統(tǒng)計(jì)學(xué)意義。

1. 2 實(shí)驗(yàn)方法 本組所有病例均于晨起空腹靜脈采血3 ml, 經(jīng)自然凝固后分離血清保存于-20℃待測。①抗CCP抗體檢測:采用酶聯(lián)免疫吸附法(ELISA), 試劑由歐洲診斷公司提供, 采用Stat fax-2100型酶標(biāo)儀檢測吸光度, 嚴(yán)格按照說明書操作, 結(jié)果以>25 U/ml判定為陽性。②RF檢測:采用透射比濁法, 試劑儀器為全自動(dòng)特種蛋白儀, 嚴(yán)格按照說明書操作, 結(jié)果以>25 U/ml判定為陽性。

1. 3 統(tǒng)計(jì)學(xué)方法 采用SPSS18.0統(tǒng)計(jì)軟件進(jìn)行數(shù)據(jù)處理, 采用四格表計(jì)算抗CCP抗體及RF的敏感性和特異性, 組間比較采用χ2檢驗(yàn), P

2 結(jié)果

RA、非RA患者抗CCP抗體、RF檢測結(jié)果見表1, RA診斷結(jié)果顯示:抗CCP抗體敏感性為78.8%, 特異性為89.4%;RF因子敏感性為89.0%, 特異性為65.9%;抗CCP抗體和RF聯(lián)合檢測對RA進(jìn)行診斷敏感性為98.2%, 特異性為59.6%。抗CCP和RF因子聯(lián)合檢測診斷RA可明顯提高敏感性, 但特異性下降, 差異具有統(tǒng)計(jì)學(xué)意義(P

3 討論

類風(fēng)濕關(guān)節(jié)炎(RA)是一種常見的自身免疫疾病, 具有高發(fā)性、高致殘性等特點(diǎn), 關(guān)節(jié)及周圍組織呈對稱性, 可引發(fā)多種并發(fā)癥。臨床治療RA的目標(biāo)是確保疾病無進(jìn)展, 使之保持正常的生理功能, 以達(dá)到緩解病情的目的。因此對RA早期進(jìn)行診斷確診是治療的關(guān)鍵。目前診斷RA多依賴癥狀、X線改變以及對RF的檢測, 但臨床表現(xiàn)多不典型, 易錯(cuò)失治療時(shí)機(jī), 而RF的檢測具有局限性, 敏感但特異性低, 在其他的結(jié)締組織疾病, 如系統(tǒng)性紅斑狼瘡以及部分健康老人的血清里都可以檢測出, 因此給臨床確診帶來困難。

抗環(huán)瓜氨酸肽抗體(CCP)是環(huán)狀聚絲蛋白的多肽片段, 可在RA早期出現(xiàn), 通常是RA患者還未出現(xiàn)關(guān)節(jié)損傷之前就能檢出, 對類風(fēng)濕性關(guān)節(jié)炎(RA)具有較高的特異性, 可克服RF存在的不足。本研究對118例RA患者和85例非RA患者血清抗CCP抗體、RF進(jìn)行平行檢測, 特異性差異具有統(tǒng)計(jì)學(xué)意義??笴CP抗體較RF具有較高的特異性(89.4%)可避免臨床誤診;聯(lián)合檢測可提高試驗(yàn)敏感性(98.2%)降低了RF對早期RA的漏診率[1]。聯(lián)合檢測診斷RA可靠有效, 對于RA早期治療與干預(yù)、阻斷病情發(fā)展、提高患者生活質(zhì)量具有重要意義。

篇10

【關(guān)鍵詞】 腦CT檢查;精神發(fā)育;診斷;治療

doi:10.3969/j.issn.1004-7484(s).2013.11.801 文章編號:1004-7484(2013)-11-6783-01

精神發(fā)育遲滯(mental retardation,MR)是指個(gè)體在發(fā)育階段(通常指18歲以前),由生物學(xué)因素、心理社會(huì)因素等原因所引起,以智力發(fā)育不全或受阻和社會(huì)適應(yīng)困難為主要特征的一組綜合征。主要有兩大方面的原因引起精神發(fā)育遲滯:生物學(xué)因素和心理社會(huì)因素,目前對于精神發(fā)育遲滯的診斷,臨床主要根據(jù)智力測評,生活能力測試,心理年齡評價(jià)等方面進(jìn)行綜合評估,根據(jù)智力水平的不同,精神發(fā)育遲滯共分為輕度、中度、重度和極重度四級。程度越重,患者預(yù)后及通過康復(fù)訓(xùn)練所獲的個(gè)人能力改善程度也越差。因此,準(zhǔn)確定級對患者的預(yù)后意義重大。本文收集100例精神發(fā)育遲滯患者的CT和臨床資料,并結(jié)合文獻(xiàn)進(jìn)行初步探討。

1 資料與方法

1.1 一般資料 從2009年4月至2010年4月100例門診診斷為精神發(fā)育遲滯并登記鑒定的患者中,選取有頭顱CT檢查結(jié)果的病例100例,其中男55例,女40例,均自幼發(fā)生智障,無嚴(yán)重腦外傷史及癲癇史。年齡1-18歲,平均年齡11歲。

1.2 研究方法 影像學(xué)檢查方法:采用Philips Brilliance 6螺旋CT機(jī),以O(shè)M線為起始線進(jìn)行頭顱軸掃,掃描參數(shù):管電壓120kV,成人管電流150mA,年齡小于12歲管電流100mA,轉(zhuǎn)速115s/圈,探測器寬度6×3mm,層厚9mm軸位掃描。濾過函數(shù)Brain Standard(UB),用Philips Brilliance 6自帶工作站EBW作圖像后處理,軟件版本213。

2 結(jié) 果

100例患者中,CT檢查結(jié)果能有效判定為92例,需其他檢查共同判定有8例。CT檢查能有效檢查出的病理有:囊腫,包括蛛網(wǎng)膜囊腫、透明膈囊腫、枕大池囊腫,交通性腦積水;腦發(fā)育異常,包括大腦或小腦半球體積異常、小腦蚓部及胼胝體發(fā)育異常、平滑腦畸形、巨腦回畸形、腦裂畸形、灰質(zhì)異位等;腦白質(zhì)異常,包括髓鞘形成不良或髓鞘脫失。

3 討 論

CT以其對組織解剖結(jié)構(gòu)較高的密度分辨力及分層記錄圖像的優(yōu)勢而廣泛應(yīng)用于臨床及研究,尤其是中樞神經(jīng)系統(tǒng)。早在八十年代,就有關(guān)于CT應(yīng)用于精神疾病的研究。根據(jù)相關(guān)文獻(xiàn)報(bào)道,對于有腦部器質(zhì)性病變的精神疾患,CT有較高的陽性檢出率,并且病變范圍大小與智力損害和精神癥狀的嚴(yán)重程度呈正相關(guān)。隨著CT技術(shù)的飛速進(jìn)步,其在有器質(zhì)性病變的精神疾病中的應(yīng)用也得了很大的發(fā)展。WHO(1985)資料報(bào)導(dǎo)精神發(fā)育遲滯癥的輕度患病率為3%,重度(含中度)約為3‰-4‰,可以看出該病不容輕視。目前,精神病學(xué)有關(guān)精神發(fā)育遲滯診斷標(biāo)準(zhǔn),仍然是以智力測評、社會(huì)適應(yīng)能力和心理年齡綜合評價(jià)作為診斷、分級的標(biāo)準(zhǔn),而未將腦CT的異常列為分級的參考指標(biāo)。

從本次的研究結(jié)果表明,CT檢查結(jié)果有效率很高為92正常的比例明顯增加,但異常病例中腦發(fā)育異常仍占一定比例,占8%。但異常病例中,仍然以腦發(fā)育異常為主。精神發(fā)育遲滯伴有腦部器質(zhì)性損害的發(fā)生率較高,其原因主要有:①遺傳異常,由基因或染色體異常所致的神經(jīng)系統(tǒng)發(fā)育不良、畸形或先天性代謝Down綜合征、Turner綜合征;苯丙酮尿癥、半乳糖血癥、家族性黑朦性癡呆;神經(jīng)纖維瘤病、結(jié)節(jié)性硬化及先天性腦積水、腦穿通畸形、小頭畸形等。這些大都可有影像學(xué)表現(xiàn)。②環(huán)境因素:妊產(chǎn)期有害因素,主要是妊早期感染,如巨細(xì)胞病毒和單純皰疹病毒感染,此類患兒生后約15%-20%有先天畸形,表現(xiàn)為小頭、智力遲鈍、癲癇等;另外,應(yīng)該注意到妊娠期受到放射線照射也可能導(dǎo)致患兒出現(xiàn)小頭、智力發(fā)育遲滯及器官發(fā)育畸形等。神經(jīng)病理學(xué)有相關(guān)研究報(bào)道,極重度精神發(fā)育遲滯患者中90%肉眼和鏡下腦組織異常改變,3/4可明確診斷,10%肉眼和鏡下腦組織無改變。但是,精神發(fā)育遲滯患者中腦CT檢查存在一定數(shù)量的陰性結(jié)果,部分腦CT異常者卻與臨床分級相矛盾,能否假設(shè)這種現(xiàn)象的發(fā)生可能與以下因素有關(guān):腦CT檢查為正常的精神發(fā)育遲滯患者中,部分患者腦解剖結(jié)構(gòu)的確沒有異常,只是神經(jīng)遞質(zhì)濃度和受體的敏感度發(fā)生改變,普通CT無法顯示,腦部存在較輕微解剖改變,但受CT分辨力及影像科醫(yī)師識(shí)別能力的限制而未能檢出;目前臨床使用的評定方式并未將被鑒定者的年齡、生活環(huán)境、父母受教育程度、民族、地域、醫(yī)患之間是否使用同一種語言進(jìn)行交流等作為影響因子,不能排除由于語言文字等方面的差異,使受測者無法理解檢測者的目的及要求,導(dǎo)致量分過低而給予不恰當(dāng)?shù)闹钦系燃壍目赡?;智障等級為輕-中度患者中,也有少數(shù)患者CT檢查存在腦發(fā)育異常的結(jié)果,推測這可能與患者接受鑒定時(shí)的年齡偏大,或幼年時(shí)接受過良好的家庭教育和(或)系統(tǒng)的康復(fù)訓(xùn)練,患者的智商和依從度獲得明顯改善有關(guān)。

本組數(shù)據(jù)顯示,智障程度越輕,腦器質(zhì)性病變發(fā)生幾率也越低,這與國內(nèi)外同類文獻(xiàn)相吻合。綜上所述,對智障患者的相關(guān)測評,結(jié)合腦CT檢查結(jié)果,對確定等級有積極的意義。

參考文獻(xiàn)