c語言指針范文

時間:2023-04-03 09:59:48

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

c語言指針

篇1

關鍵詞: C語言 指針 函數 數組

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

一、理解指針

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

二、指針與函數

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

子函數實現交換:

swap(p1,p2)

int *p1,*p2;

{int p;

p=*p1;

*p1=*p2;

*p2=p;

}

主程序實現調用,輸出:

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);

}

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

三、指針與數組

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

四、結語

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

參考文獻:

[1]譚浩強.C程序設計教程.北京:清華大學出版社,2008,11.

[2]陳剛.C語言程序設計.清華大學出版社,2010,2.

篇2

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

1 引言

C語言誕生于20世紀70年代的美國貝爾實驗室,它是面向過程的,可移植的,功能強大的高級程序設計語言。盡管現如今有許多功能更強大的面向對象的高級程序設計語言(如C++,Java,C#等),C語言仍然具有旺盛的生命力,其仍是計算機領域的通用程序設計語言,特別是在底層的硬件驅動領域。這一切都要歸功于指針,指針是C語言最重要的特性之一,利用它可以直接操作硬件,這是它的優點,也是它的缺點,因為直接操作硬件稍有不慎,就會導致非常嚴重的后果。

2 C語言指針簡介

現代計算機中大部分都是按字節劃分內存的,每個字節都有唯一的地址,C語言中的所有指針操作都是基于這些地址的。在C程序中一個變量會占用一個或多個字節,第一個字節的地址就是該變量的地址,將該地址賦值給某個變量后,就稱其為指針。指針在C程序開發過程中發揮著舉足輕重的作用,其基本應用有如下三點:

2.1 指向基本數據類型

假設我們定義int i = 10,則我們就占用了4個字節的內存(假設是在32位架構下),這4個字節就和變量名i建立了某種特殊聯系,就可以通過該變量i對這4個字節進行讀寫操作。或者可以通過指針方式操控這4個字節。定義int*p = &i,就將該變量的首地址賦值給了指針變量p。然后就可以通過*p,對這4個字節進行讀寫操作。此時*p和i是完全等價的,即*p是變量i的別名。這是指針最基礎的應用。

2.2 當指針作為函數參數時,它就可以發揮出強大的作用,特別是在數組,字符串,文件等的處理中

主要作用有如下兩點:

2.2.1 讓函數返回多個值。假設有如下函數聲明

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

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

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

則在函數內部就不可以對變量a和b進行修改。這種技術在字符串處理函數中應用的特別多,是因為不希望源字符串被誤改。例如:

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

2.2.2 節約內存空間,提高運行速度

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

2.3 指針還可應用于動態內存分配,從而修補數組在程序運行期間無法動態改變大小這一缺陷。動態內存分配主要用于構建鏈表,數,圖等數據結構

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

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

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

4 分析反匯編代碼

測試代碼如下:

int main(void)

{

int i = 10;

int *p = &i;

*p = 123;

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

return 0;

}

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

對上述代碼進行反匯編,在段截取一段與本文相關的代碼。這是在Linux下的反匯編結果,所以是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函數執行時,其棧幀會不斷變化,其變化過程如圖1和圖2所示。為了敘述的方便,假設棧幀-0x14(%ebp)處的內存地址為0x12345678,即灰色部分。這11行匯編代碼具體功能詳述如下:

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

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

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

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

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

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

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

(8)更新ESP,因為-0x10(%ebp)和-0x14(%ebp)處這8個字節被占用了。

(9)將EAX壓棧,為調用printf做準備。

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

(11)調用printf函數。

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

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

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

然后在程序中就可以像對待普通變量一樣對它進行寫入和讀取工作。而在匯編層,依然是寄存器間接尋址,在此不再贅述。因為涉及到大量的寄存器的讀寫,所以通常的做法就是把大量的與寄存器讀寫有關的宏定義放在一個單獨的文件,便于查找和修改。

5 總結

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

參考文獻

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

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

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

篇3

關鍵詞:指針變量 數組 字符串 函數 常見問題

中圖分類號:TP312 文獻標識碼:A 文章編號:1673-9795(2013)08(b)-0163-01

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

1 指針變量的使用優勢及常規用法

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

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

2.1 指針變量的初始化

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

int *p; *p=100;

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

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

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

2.2 指針變量的賦值

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

int a,*p; p=a;

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

int a,*p; p=&a;

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

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

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

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

2.3 指針在函數之間值的傳遞

#include “stdio.h”

void swap(int *a, int *b)

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

void main( )

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

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

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

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

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

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

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

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

3 指針的使用是C語言程序設計中最重要的一環

能否正確理解和使用指針是我們是否真正掌握C語言的一個標志。C語言中指針的使用比較靈活,很多人在實際編程中很容易出錯,而且這種錯誤恰恰又難以發現,所以建議初學者大量地上機調試程序,以弄清一些細節,并積累經驗,為后續編程內容的學習打好堅實的基礎。同時,指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程并上機調試。只要做到這些,指針也是不難掌握的。

參考文獻

篇4

關鍵詞:存儲空間圖;間接尋址;一級指針;二級指針;存儲單元

中圖分類號:TP311文獻標識碼: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 程序員有時也需要使用匯編語言解決實際問題,理由很簡單:精簡、高效和 libc 無關性。假設要移植 Linux 到某一特定的嵌入式硬件環境下,首先必然面臨如何減少系統大小、提高執行效率等問題,此時或許只有匯編語言能幫上忙了。我們常說匯編語言的抽象是C語言, 而C語言中最靈活是C語言中擁有“指針”這個數據類型。那么匯編語言和C語言中的指針有什么樣的關系呢?我們也知道在匯編語言中,幾乎所有對內存的操作都是對給定地址的內存進行訪問來完成的,那么在匯編語言中,絕大多數操作也必然和地址(即指針)產生或多或少的聯系。匯編語言和CPU以及內存,端口等硬件知識是連在一起的。匯編語言中存儲數據的地方不僅有寄存器而且還有存儲單元,更多的數據則保存在存儲單元中。因此,對編程人員而言,他肯定迫切地希望訪問內存,以保存

更多的數據,本文將重點闡述訪問數據的方式。

2 存儲空間圖的概念

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

3 兩門語言之間的內在聯系

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

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

3.1.1 C語言中一級指針定義

指針定義形如:數據類型 *指針變量,它的存儲空間圖表示如下:

圖1中X就是一級指針,Y是一個整形變量,X、Y的本質區別在于X單元的值是用于存放內存單元的地址,Y單元是存放任意類型的數據。X之所以指向Y,是因為Y單元的地址賦予了X,同時X所指向的類型和Y同類型。

圖1

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

它的存儲空間圖表示如下:

圖2中si是cpu中的一個寄存器,si中存放著Y所在單元的地址,Y是一個單元的名稱,Y單元存放著普通操作數,si之所以指向Y,是因為Y單元的地址賦予了si。

圖2

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

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

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

main()

{int a=3,*p;

p=&a

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

}

例2 用間接尋址方法把a單元中的數據送往al寄存器中:

data segment

a db 3

data ends

……

lea si, a

mov al, [si]

……

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

圖3 C語言編程的存儲空間圖圖4 匯編語言編程的存儲空間圖

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

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

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

指針定義形如:數據類型 **指針變量,它的存儲空間圖表示如下:

圖5中X相對與Z這個變量是二級指針,它和一級指針的區別在于X這個指針所指向的內容仍然是某個單元的地址(圖中是Z單元的地址)。要想輸出Z單元的內容,則需要通過兩次指向才能完成。

圖5

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

它的存儲空間圖表示如下:

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

圖6

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

例3 輸出以下字符串

main()

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

char **sp = p;

int i;

for(i=0; i

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

}

圖7 C語言編程的存儲空間圖

例4 累加數組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 匯編語言編程的存儲空間圖

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

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

4 結束語

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

參考文獻:

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

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

[3] 譚浩強. C程序設計(第二版). 清華大學出版社出版,2005.6.

[4] 錢能. C++程序設計教程. 清華大學出版社, 2005.5.

[5] 沈美明. IBM PC匯編語言程序設計. 清華大學出版社,1993.9.

篇5

1.指針的定義

指針定義格式如下:

類型關鍵字 *指針變量名

2.用指針表示變量

例1:

int*p;

int a;

p=&a;

“*”是乘號,又可以定義指針,還可以取指針所指向的變量的內容。

#include

void main()

{

int *p,a;

int count=19;

p=&count;

a=*p;

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

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

}

“*”放在可執行語句中的指針之前,表示取指針所指向的變量的內容。

“*”放在指針定義中時,稱指針定義符。

該程序運行結果如下:

19

19

3.用指針表示數組元素

例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”) ;

}

該程序運行結果如下:

12345

該例中輸出的每個數組元素都是一個整型數。

#include

void main()

{

char a[]="ABCDE";

char *p=a;

for(p=a;p

{

printf("%c",*p);

}

printf("\n") ;

}

該程序運行結果如下:

ABCDE

該例中輸出的每個數組元素都是一個字符。

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);

}

該程序運行結果如下:

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);

}

該程序運行結果如下:

abcdefgh

abcdefgh

bcdefgh

#include

void main()

{

char a[]=”ABCDE”;

char *p=NULL;

for(p=a;p

{

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

}

}

該程序運行結果如下:

ABCDE

BCDE

CDE

DE

E

#include

void main()

{

char a[]=”ABCDE”;

char *p=NULL;

for(p=a;p

{

printf(“%c”,*p);

}

}

該程序運行結果如下:

ABCDE

5.指針數組與指向數組的指針

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

指針數組定義的格式如下:

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

在實際應用中,常常使用一維一級指針數組來存放若干個字符串,這樣操作起來比較方便。

例:編程實現輸入星期幾的數字后,輸出該數字對應的英文全名。

#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]);

}

}

該程序中指針數組name經初始化后有8個元素,name[0]不用,name[1]指向Monday,name[2]指向Tuesday …… 。

指向數組的指針,定義格式為:

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

#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]);

}

該程序運行結果如下:

907

6.用指針表示結構體成員

#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]);

}

該程序運行結果如下:

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;

}

}

該程序運行結果如下:

20 15

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

本文主要歸納了C語言中指針的基本用法,熟練地掌握指針的基本用法,為指針在程序中的應用打下一個良好的基礎。在以后的文章中將詳細介紹指針在程序中的應用。

參考文獻:

篇6

關鍵詞:C語言;指針;數組

中圖分類號:TP311文獻標識碼: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語言課程,是計算機科學與技術以及相關學科專業的一門專業基礎課。該課程學習掌握的好壞對后繼課程有著非常重要的影響,而C語言課程中有兩天非常重要的部分,一個是數組,另一個是指針。數組有一維數組、二維數組等,學生理解相對容易,寫程序也很容易上手。而指針則是C語言課程中最難學習和掌握的內容,雖然花費了大量的時間,但是也很難熟練運用。

1 結合實例剖析指針和數組的特點

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

1.1 基于指針的實現方法

首先使用指針來實現該函數的功能。

#include

#include //使用到的頭文件

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

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

void main()

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

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

countValue(aa,&n);//轉入countValue執行

for(k=0;k

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

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

printf("\n"); }

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

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

void writeDAT()//寫函數的具體實現

{ int aa[1000],n,k;

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

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

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

for(k=0;k

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

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

fprintf(fp,"\n"); }

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

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

}

以下是使用指針對函數countValue的具體實現。

void countValue(int *a,int *n) /*定義傳遞指針變量a為數組指針和n統計滿足條件的個數指針*/

{ int i;

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

for(i=1;i

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

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

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

1.2 基于數組的實現方法

以下是數組的實現方法。

#include

#include //使用到的頭文件

void main()

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

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

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

for(i=1;i

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

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

for(k=0;k

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

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

printf("\n"); }

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

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語句是實現aa中的數據寫入文件out.dat中,每行顯示10個 */

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

}

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

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

2 結束語

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

參考文獻:

[1] 李明輝,丁海艷,萬克星,等.全國計算機等級考試上機考試題庫――三級網絡技術[M].成都:電子科技大學出版社,2008.

[2] 譚浩強.C語言程序設計教程[M].3版.北京:高等教育出版社,2006.

篇7

關鍵詞:C++語言程序設計;函數指針;分析研究

中圖分類號:TP311.11 文獻標識碼: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

一、認識C++語言程序設計中的函數指針

(一)指針與函數。在C++語言程序設計中,將指針與函數結合在一起使用具有非常豐富的內涵。比如說,可以把指針作為函數的參數來使用,也可以把指針作為函數的返回值,另外,指針可以指向函數成為函數指針等。在C++語言程序設計中,用指針作函數的參數,從而實現地址傳參的調用。而所謂的調用就是系統自動將實參地址的值賦給其所對應的形參指針,從而使形參指針指向實際參數變量。這樣一來,形參在函數體內的變化,將會直接影響到調用函數中與之對應的實參的值。

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

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

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

二、使用C++語言程序設計函數指針需要注意的問題

盡管函數指針的使用可以為程序設計帶來很多的方便,但是由于指針變量自身存在的缺陷,所以在使用中如果不小心的話就會出現錯誤,嚴重的話就可能導致系統的崩潰,所以這里有必要就C++語言程序設計函數指針應用中經常出現的問題進行說明。

第一、指針變量初始值的賦值問題。盡管指針變量是指向的是相應數據變量的存儲地址,但是在使用該指針變量前必須對指針變量的初值進行賦值,如果不對其賦值的話,系統就會隨機對其進行賦值,顯然,這就會導致比較嚴重的錯誤。

第二、指針變量所指對象的存儲單元單元分配問題。在對指針變量所指的對象進行賦值時需要為其所指的對象分配充足的存儲單元,如果存儲單元分配不足的話也將會發生一系列的錯誤。

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

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

三、C++語言程序設計中函數指針的應用技巧分析

函數指針作為一種具有特殊用途的指針,它廣泛的應用于C++語言程序設計中。其中C++語言程序設計中的函數指針主要用于調用函數以及充當函數的參數這兩個方面。而C++語言程序設計中函數指針的應用是有技巧的,其使用技巧如下:

第一、多態機制的實現。在C++語言程序設計中使用函數指針來實現多態機制是比較復雜的,其中主要是通過虛函數表來實現的,其中虛函數表中存放的就是由函數指針組成的數組,由這些函數指針來指向實際所要調用的函數。

第二、回調函數。所謂的回調函數可以這樣的來理解,如果把某個函數的指針作為參數將其傳遞給另一個函數時,當這個指針用來指向函數時,就是回調函數。在C++語言程序設計中回調函數應用的比較廣泛,舉個例子,譬如Win32程序設計中的WinProc其實就是一種回調函數,它主要是用來處理窗口的相關消息。

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

參考文獻:

[1]張海平.C/C++語言中函數指針的深入分析與應用[J].軟件開發與設計,2009(22)

篇8

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

1 資料與方法

1.1一般資料

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

1.2方法

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

1.3統計學方法

應用SPSS10.0軟件包對其資料進行統計學處理分析。

2 結果

2.1下咽癌具體分型分析

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

2.2下咽癌患者CT具體診斷

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

3 討論

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

下咽癌其屬于喉癌,一般分為喉內喉外,喉內癌一般限于喉內,發展較為緩慢,擴散也較為晚,另喉外癌則則是起源于喉的下咽,生長快,轉移較早,依據1961年的第七屆國際耳鼻咽喉會議[2],其將下咽癌分出單列。

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

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

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

參 考 文 獻

[1]屠規益.現代頭頸腫瘤外科學[M].北京:科學出版社,2004,594.

[2]黃選兆,汪吉寶.實用耳鼻眼科學[M].北京:人民衛生出版社,1998,398-402.

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

篇9

【關鍵詞】 抗CCP抗體;RF因子;類風濕關節炎;應用價值

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

1 資料與方法

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

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

1. 3 統計學方法 采用SPSS18.0統計軟件進行數據處理, 采用四格表計算抗CCP抗體及RF的敏感性和特異性, 組間比較采用χ2檢驗, P

2 結果

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

3 討論

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

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

篇10

【關鍵詞】 腦CT檢查;精神發育;診斷;治療

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

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

1 資料與方法

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

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

2 結 果

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

3 討 論

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

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

本組數據顯示,智障程度越輕,腦器質性病變發生幾率也越低,這與國內外同類文獻相吻合。綜上所述,對智障患者的相關測評,結合腦CT檢查結果,對確定等級有積極的意義。

參考文獻