




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
c語言指針范文10篇
指針是C語言的一個最重要的特征,它供應了一種統一的方法,使其能訪問遠程的數據結構。但對C語言初學者而言,在編程過程中嫻熟的使用指針并不能像使用int型變量一樣地輕松開心,簡單上手,往往是不得其精髓。我們知道,不論什么時候,運行一個程序A,首先都是操作系統自身的加載器把A裝入內存,然后CPU才能執行。所以A程序的全部要素都會駐留在內存的某個位置。
下面我們看一段示例程序。
#include
intcmp(intfirst,intsecond)
{
return(first>second?first:second);
}
intmain(intargc,char**argv)
{
inti=5;
intj=9;
returncmp(i,j);
}
首先,編譯器會為變量i和j開拓內存空間,用來存儲i和j的值。同時也會為函數cmp開拓空間來存放其代碼。這樣使得最終的可執行程序就變為了跟內存一一對應的序列。操作系統的加載器把這個可執行程序載入內存后,cpu就可以按一條條的語句挨次執行了。
既然內存空間同程序的全部要素是一一對應的,那么怎么區分各要素的存放位置呢?內存使用不同的地址存放不同的要素,如下所示。
由于變量都存放于內存地址空間,并且與地址之間是一一對應的,那么利用地址能做些什么呢?我們可以把地址存放到別的變量中,以便我們可以在以后程序的某個地方使用它。C語言有一個特地用來存儲內存地址的變量,這就是指針變量,通常我們稱之為指針(pointer)。它是一種變量類型,這種變量便利我們把需要操控的內存地址記憶起來。
定義指針
定義指針的運算符同乘法運算符是一樣的,都用“*”表示。定義一個指針變量在語法上是簡潔的,同我們定義其他變量的區分是:首先規定它指向的變量類型,然后并不是馬上就給出其變量的標識符,而是在變量類型同變量標識符之間插入指針運算符(星號),這樣就告知編譯器這是一個指針變量。
C語言中指針可以指向任何的數據類型,包括函數。函數指針的定義是:函數返回值+(*+函數指針變量標識符)+(函數的參數列表)。函數指針能構建出更加清楚的程序結構。編程中常常使用的指針定義就是這兩種,當然有些定義可能只是語法上面有意義,但是語義上面不肯定有詳細的意義。例如,int*(*(*(*f)()))()聲明f是一個函數指針,該函數返回一個指針,該指針指向數組,該數組元素是指針,那些指針指向返回值類型為整型指針的函數。這樣的聲明可能永久也不能應用到實際的代碼中。
指針和數組
數組是內存中一段連續相同類型的內存數據,這組數據的首地址以數組名字來標識。全部數組對其數據的操控都可以使用指針來實現,同理,指針指向一段內存數據時,也可以使用數組下標的方式來實現操作。
數組與指針在使用上的某些地方是特別相像的,但是數組與指針又有一些細小的區分。數組名表現為一個靜態指針,也可以直接把它賦值給指針變量,但它的大小與指針通常是不同的。數組名的內涵在于其指代的實體是一種數據結構,這種數據結構就是數組。數組名可以作為參數傳入一個接受參數為指針的函數內部,但是此時數組完全丟失了數組的本義,變成了完全的指針類型,其常量特性(可以作自增、自減等操作)可以被修改。并且,數組名不能再重新賦值為其他的數組名字,而指針變量是可以被重新賦值并指向一段新的內存地址的。
指針的運算
指針的運算指的是指針的--、++、-和+運算,一個指針可以加上或者減去一個整數。兩個指針相減得到的是指針之間相隔的元素個數。不同的指針變量之間進行相加運算盡管在語法上是合理的,但是從語義上來講是沒有意義的。除了void型指針和函數指針以外,全部其他類型的指針都可以進行指針運算。通過指針變量的增加或削減,指針變量會指向新的內存地址。
一般來說,指針變量自身的大小在理論上是指機器的字長,但是指針變量的運算并不是根據指針變量自身的大小進行內存偏移的,而是根據指針變量指向的變量類型大小進行內存偏移的。比如,聲明一個整形的指針p,假定p的地址是0x4323672,那么++p后p的值變為0x43236726。偏移的內存大小等于整形變量的內存大小4(sizeof(int))。同理,double型指針進行++運算后偏移值就是8(sizeof(double))。
指針強轉
猶如整形變量可以強轉為浮點型變量一樣,指針類型也可以通過強轉變成新的指針類型,比如我們可以把整形指針強轉為字符型指針。指針強轉最迷人的地方就在于對內存數據進行操控就夠了。指針強轉使得指針對數據的操控更具有針對性,而且通過指針的默認強轉可以使得函數的參數更簡潔,且傳遞的信息量是不變的。比如,void*作為參數時可以把任意的指針變量傳遞到函數內部進行相關的操作。
下面我們來看一個詳細的例子。數據的內存布局如下圖所示,首先是一個字符型數據,緊接著的是兩個整形數據,最終面是三個結構體A型數據。我們需要做的就是把這些數據讀出來。
我們先聲明一個字符型的指針p,使其指向第一個數據的內存地址。取完第一個字符型數據后,通過p++,然后強轉指針為整形指針,就可以很便利地取出整形數據,同理可取出三個結構體數據。
指針作為參數
先看一個例子,我們有兩個整形變量,x的值為777,y的值為888,現在想構建一個函數用來交換兩個整形變量的值,使得x的值為888,y的值為777。首先我們以傳值的方式構建
voidswap_value(intParam1,intParam2)
{
intTemp=Param1;
Param1=Param2;
Param2=Temp;
}
我們調用函數swap_value(x,y)后,發覺x、y的值并沒有被交換。造成這種結果的緣由是由于函數調用時,首先對傳入的實參進行變量的拷貝,交換的值是形參的值,并不是實參的值。而原來的實參加拷貝后的形參變量所處的內存也不同,所以并沒有交換勝利。
要想實現函數內部對這兩個值的交換,必需使得實參加拷貝后的形參變量所處的內存是相同的。我們知道了原理后,修正函數參數列表,以指針的方式重新構建函數如下:
voidswap_value(int*Param1,int*Param2)
{
intTemp=*Param1;
*Param1=*Param2;
*Param2=Temp;
}
這時候我們發覺x、y的值被交換了。通過上面的例子可以看出,使用指針作為參數可以修改原來的變量值,使得函數實現的機能更加模塊化,便利了程序的設計。
野指針
前面我們已經爭論過指針變量同內存的關系,了解了指針變量里面存放的是某個變量的內存地址,該地址可以在程序的某個位置使用,以便利我們更改或取得該變量的值。指針使得我們擁有了操控內存的利器,但同時指針也是一把雙刃劍。我們必需時刻確保指針變量的值是我們意圖操控的內存地址。假如指針變量的值被不受控的更改或者初始化不正確,那么我們就使用了錯誤的地址,從而導致程序錯誤,通常我們稱這個導致程序錯誤的指針變量為野指針。由于使用了野指針而產生的程序錯誤大多時候是隱藏的,難于跟蹤的。野指針的產生主要是由于以下幾種狀況。
(1)聲明白指針變量,但是沒有正確的初始化就使用了該指針變量。
(2)使用指針變量之前沒有對其進行平安檢查。
(3)指針指向的內存變為了無效值,但沒有準時對指針清零,導致程序某處引用了該指針。
(4)多個指針同時指向同一內存區域,程序某處通過某個指針釋放了該內存,但是沒有準時對其他的指針清零,導致程序某處進行了錯誤的引用。
(5)多線程時,對全局的指針變量沒有進行鎖處理。
多級指針
定義一級指針我們使用一個‘*’,在定義多級指針時,是幾級指針我們就使用幾個‘*’。例如,聲明一個整型的二級指針(int**ppVar;)。下面以這個二級指針為例說明一下二級指針的意義。
二級指針變量同樣是保存了一個地址,這個地址就是某個一級指針變量的地址,而一級指針變量里面保存了最終需要操作的變量的地址,如下所示。
0x43236400x4323668
二級指針變量的值為0x4323640,就是一級指針變量pVar的地址,變量pVar的值為0x4323668,就是變量Var的地址。假如需要修轉變量Var的值,我們可以直接修正**ppVar的值就可以了。
三級指針或者更多級指針的原理與二級指針的原理是相同的,只是需要索引的內存空間的深度增加了。在程序設計中,引入多級指針更多的時候并不僅僅是為了關注最終一級指針所能取得的變量,而更多的是為了使用和操控其中間的級數的內存值。比如利用二級指針作為函數的參數在某個函數內部對其安排內存,我們更想利用的是一級指針變量自身。當然,在進行程序設計時,有時我們要在可讀性與語法有效性之間做出選擇,在實現代碼的過程中能用低級指針實現的盡量不要使用多級指針實現,這樣的代碼更利于維護。
小結
在C語言中指針的使用特別的廣泛,有時指針是實現某個計算的唯一方法。同樣的機能使用指針通常也可以獲得更加高效、緊湊的代碼。指針使得函數構建的機能更加的模塊化,使得函數參數棧更加的短小。同時在操縱字符串的運算中,指針更加簡潔直觀。
在大項目構建時,把函數指針同數據封裝在一起能夠使得代碼編程面對對象的結構,使得后期代碼的維護成本大大降低,代碼的表現也更加具有現實意義。
關鍵詞C語言運算指針
指針是C語言最強大的功能,也是C語言中最難以把握的功能。把握指針的應用,可以使程序簡潔、高效。每一個學習和使用C語言的人,都應當深化的學習和把握指針。指針算術運算是指針操作中比較難把握的部分。在本文中,我們將總結C語言的指針運算。
指針可以執行的算術運算有:①指針自增;②指針自減;③指針加上一個整型常量或整型變量n;④指針減去一個整型常量或整型變量n;⑤兩個指針相減。
需要留意的是,通常只有當指針指向某個數組元素時,才對指針作上述5種算術運算。
一、指針自增
指針自增就是指向本數組的下一個元素。
假設有數組定義如下:doublea={3.2,4.75,7.2,9,1.7};
double*p=a;
此時內存圖示如下:
此時若執行p++,指針p指向數組的下一個元素,圖示如下:
二、指針自減
指針自減就是指向本數組的上一個元素。
例如有數組定義如下:doublea={3.2,4.75,7.2,9,1.7};
double*p=
內存圖示如下:
此時若執行p--,指針p指向數組的上一個元素,圖示如下:
三、指針加上一個整型常量或整型變量n
指針加上一個整型常量或整型變量n的結果是得到一個指向本指針所指向的數組元素之后第n個元素的指針。例如數組定義如下:
doublea={3.2,4.75,7.2,9,1.7};
double*p=a;
此時指針p指向數組a的第一個元素。
若執行p=p+3,指針p指向數組元素a
四、指針減去一個整型常量或整型變量n
指針減去一個整型常量或整型變量n的結果是得到一個指向本指針所指向的數組元素之前第n個元素的指針。
若有定義doublea={3.2,4.75,7.2,9,1.7};
double*p=
指針p指向數組元素a。
假如執行p=p-3之后,指針p指向數組元素a
五、兩個指針相減
首先必需明確,通常只有當兩個指針指向同一個數組時才對兩個指針相減。
兩個指針相減得到的整數是這兩個指針所指向的元素索引值之差。
例如有如下代碼:
inta={10,20,30,40,50};
int*p1=a;
int*p2=
intx=p2-p1;
由于p1和p2位置如下:
所以表達式p2-p1的值是3
結語:指針算術運算是初學者感到比較困惑的問題,盼望本文能對他們有所關心。
簡介:
c語言指針范文第3篇C語言指針反匯編間接尋址寄存器棧
1引言
C語言誕生于20世紀70年月的美國貝爾試驗室,它是面對過程的,可移植的,功能強大的高級程序設計語言。盡管現如今有很多功能更強大的面對對象的高級程序設計語言(如C++,Java,C#等),C語言仍舊具有旺盛的生命力,其仍是計算機領域的通用程序設計語言,特殊是在底層的硬件驅動領域。這一切都要歸功于指針,指針是C語言最重要的特性之一,利用它可以直接操作硬件,這是它的優點,也是它的缺點,由于直接操作硬件稍有不慎,就會導致特別嚴峻的后果。
2C語言指針簡介
現代計算機中大部分都是按字節劃分內存的,每個字節都有唯一的地址,C語言中的全部指針操作都是基于這些地址的。在C程序中一個變量會占用一個或多個字節,第一個字節的地址就是該變量的地址,將該地址賦值給某個變量后,就稱其為指針。指針在C程序開發過程中發揮著舉足輕重的作用,其基本應用有如下三點:
2.1指向基本數據類型
假設我們定義inti=10,則我們就占用了4個字節的內存(假設是在32位架構下),這4個字節就和變量名i建立了某種特別聯系,就可以通過該變量i對這4個字節進行讀寫操作。或者可以通過指針方式操控這4個字節。定義int*p=數組;教學;指針
中圖分類號:G718.5文獻標志碼:A文章編號:1674-9324(2024)45-0228-02
在C語言的教學中,“指針”這一部分內容始終是C語言的教學重點和難點,直接影響同學對后續課程的學習和把握。作為軟件開發入門課程,絕大多數時間是在講條件、循環、數組、函數,而指針內容卻是省、國家計算機二級、程序員等考試的必考內容。為了在最短的時間內達到較好的教學效果。筆者從多年的教學閱歷認為C語言的指針教學應當留意以下幾點:
一、輸入函數scanf()和數組中地址的應用
全部的書本上都有介紹scanf(格式掌握字符串,輸入項列表),此函數的輸入項列表要用“”加變量名,要將所輸入的內容放入變量的地址中,其中格式掌握串中假如有一般字符也要輸入一般字符,且有許多輸入后不能正確讀取的狀況,初學者往往感到特別困惑難以理解。其實,連續定義的多個變量在內存中也是占用連續的內存單元,只是不同的數據類型所占的字節不同,程序在運行過程中遇到第一個scanf()函數時,將要求用戶從鍵盤上按要求輸入內容,全部輸入的內容都將先放入緩沖區且你可以輸入許多內容,輸入完成后再按scanf的格式掌握字符串的格式來存入到變量的地址中,一旦輸入不合法,則認為輸入結束,后面的變量將取不到值。如:scanf(“%d:%d”,a,b);若輸入時你輸入3,4L其中a的值為3,輸入格式串中原來要求你輸入的是“:”而你輸入的是“,”,明顯不合法,則scanf函數輸入結束,后面的變量b將取不到值。同時這也很好解釋了若程序中有多個scanf函數時,為了保證每次輸入都有效,則應當在輸入函數前加一個清空緩存函數fflush(stdin)。
數組名代表的是數組的首地址,所以在scanf()函數中以”%s”為格式串所對應輸入項列表不需要加“”。如:charstr;
scanf(“%s”,str);/*將輸入的內容存儲到從數組首地址開頭的地址中*/
printf(“%s”,str);/*從數組的首地址開頭輸出字符數組的內容*/。
這些內容都與計算機的實際存儲有關(即和地址有關)。
二、指針
指針就是地址。其實前面我們在講解輸入輸出函數和數組時,我們就介紹了一些有關地址的應用。一聽自己已經用過且有所接觸了,同學也就不會感到太畏懼了。再加上時間有限,我們要言簡意賅地說明指針的用法。
1.指針的概念。指針就是內存地址。這里首先要區分三個比較接近的概念:名稱、地址和內容(值)。名稱是給內存空間取的一個簡單記憶的名字;內存中每個字節都有一個編號,就是“地址”;在地址所對應的內存單元中存放的數值即為內容或值。
為了關心讀者理解三者之間的聯系與區分,我們不妨打個比方,有一座老師辦公樓,各房間都有一個編號,如101,102,…,201,202,…。一旦各房間被安排給相應的職能部門后,各房間就掛起了部門名稱:如電子系、計算機系、環境工程系等,假如電子系被安排在101房間,我們要找到電子系的老師(內容),可以去找電子系(按名稱找),也可以去找101房間(按地址找)。類似地,對一個存儲空間的訪問既可以指出它的名稱,也可以指出它的地址。
在C語言中,假如變量p中的內容是另一個變量i的地址,則稱變量p指向變量i,或稱p是指向變量i的指針變量,形象地用圖1所示的箭頭表示。
由此可以得出結論:變量的指針即為變量的地址,而存放其他變量地址的變量是指針變量。
指針變量是一種變量,因而也具有變量的三個要素,但它是一種特別的變量,其特別性表現在它的類型取值上。詳細而言:①變量名:與一般的變量命名規章相同。②變量的值:是某個變量的內存地址。③變量的類型:主要是其指向的變量的類型。
2.指針指向簡潔變量。
如:inta=100,*p;/*指針變量的定義*/
p=a;/*指針變量的賦值*/
*p=200;/*指針變量的應用*/
printf(“%d”,a);則輸出值為200。
在此我們要理解指針一旦定義且指向了一簡潔變量,除定義和初始化時的*p,其他的*p等價于它所指向的簡潔變量(即這里的*p=a),p(指針)等價于簡潔變量的地址(即這里的p=a)。上面的輸出語句可以變為:printf(“%d”,*p)。
3.指針指向數組。
(1)指針指向一維數組。
如:inta={10,20,30,40,50},*p=a;
p++;
printf(“%d,%d,%d”,*p,*(p+2),*p++);則輸出結果為:30,50,20
以上是指針指向一維數組的基本應用,首先我們要理解有關指針的運算。
:取地址運算符。
*:指針運算符(間址訪問運算符),取指針所指向的值,若所指向二維數組則表示離取值進了一步。
++:算術運算符,表示指針往下或右移一個單位(其中這個單位和詳細的數據類型有關,假如是整型數一個單位就指2個字節,實型指4個字節)。
--:算術運算符,表示指針往上或左移一個單位。
若定義了一個指針指向了一個一維數組,則p=a的使用(原來的a,也可以用p表示,*p=*a),即*(p+i)=a=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 賬戶印章與支票的管理
- 光伏輕質組件施工方案
- 天津大學《發酵工藝學》2023-2024學年第二學期期末試卷
- 三峽電力職業學院《精神病與精神衛生》2023-2024學年第一學期期末試卷
- 2025至2031年中國洋甘菊精油行業投資前景及策略咨詢研究報告
- 2025惠州市租房合同范本
- 甘肅彩色混凝土施工方案
- 浙江工貿職業技術學院《行草》2023-2024學年第二學期期末試卷
- 2025至2031年中國棉布男式便服套裝行業投資前景及策略咨詢研究報告
- 西南交通大學希望學院《動畫影視欣賞》2023-2024學年第一學期期末試卷
- 風濕免疫病患者結核病診治及預防實踐指南(2025版)解讀課件
- 大建安-大連市建筑工程安全檔案編制指南
- 上海2024-2025學年五年級數學第二學期期末聯考模擬試題含答案
- 2025-2030中國律師事務所行業深度分析及發展前景與發展戰略研究報告
- GB/T 45421-2025城市公共設施非物流用智能儲物柜服務規范
- 代生孩子合同標準文本
- 北京市豐臺區2025屆高三一模試卷語文試題(含答案)
- 安徽省合肥市高三下學期第二次教學質量檢測數學試卷(含答案)
- 中職生對口升學模擬考試醫學類專業課綜合試卷
- (完整版)特殊教育與隨班就讀
- 旋流風口RA-N3選型計算表格
評論
0/150
提交評論