- 相關推薦
C語言中指針的概念
在信息工程中,指針是一個用來指示一個內存地址的計算機語言的變量或中央處理器(CPU)中的寄存器(Register)。下面是小編為大家整理的C語言中指針的概念,歡迎參考~
指針,是C語言中的一個重要概念及其特點,也是掌握C語言比較困難的部分。指針也就是內存地址,指針變量是用來存放內存地址的變量,在同一CPU構架下,不同類型的指針變量所占用的存儲單元長度是相同的,而存放數據的變量因數據的類型不同,所占用的存儲空間長度也不同。有了指針以后,不僅可以對數據本身,也可以對存儲數據的變量地址進行操作。
指針描述了數據在內存中的位置,標示了一個占據存儲空間的實體,在這一段空間起始位置的相對距離值。在 C/C++語言中,指針一般被認為是指針變量,指針變量的內容存儲的是其指向的對象的首地址,指向的對象可以是變量(指針變量也是變量),數組,函數等占據存儲空間的實體。
基本問題
在計算機中,所有的數據都是存放在存儲器中的,不同的數據類型占有的內存空間的大小各不相同。內存是以字節為單位的連續編址空間,每一個字節單元對應著一個獨一的編號,這個編號被稱為內存單元的地址。比如:int 類型占 4 個字節,char 類型占 1 個字節等。系統在內存中,為變量分配存儲空間的首個字節單元的地址,稱之為該變量的地址。地址用來標識每一個存儲單元,方便用戶對存儲單元中的數據進行正確的訪問。在高級語言中地址形象地稱為指針。
地址與指針
指針相對于一個內存單元來說,指的是單元的地址,該單元的內容里面存放的是數據。在 C 語言中,允許用指針變量來存放指針,因此,一個指針變量的值就是某個內存單元的地址或稱為某內存單元的指針。
變量及其定義
指針變量是存放一個內存地址的變量,不同于其他類型變量,它是專門用來存放內存地址的,也稱為地址變量。定義指針變量的一般形式為:類型說明符*變量名。
類型說明符表示指針變量所指向變量的數據類型;*表示這是一個指針變量;變量名表示定義的指針變量名,其值是一個地址,例如:char*p1;表示 p1 是一個指針變量,它的值是某個字符變量的地址。
1.1 指針與指針變量的概念,指針與地址運算符
1.在C語言中,指針是指一個變量的地址,通過變量的地址″指向″的位置找到變量的值,這種″指向″變量地址可形象地看作″指針″。用來存放指針的變量稱為指針變量,它是一種特殊的變量,它存放的是地址值。
2.定義指針變量的一般形式為:
類型名 *指針變量1,*指針變量2,…;
″類型名″稱為″基類型″它規定了后面的指針變量中存放的數據類型,″*″號表明后面的″指針變量1″,″指針變量2″等是指針變量,″*″號在定義時不能省略,否則就會變成一般變量的定義了。″指針變量1″,″指針變量2″等稱為指針變量名。
3.一個指針變量只能指向同一類型的變量。
4.與指針和指針變量有關的兩個運算符:
(1)*:指針運算符(或稱″間接訪問″運算符)
(2)&:取地址運算符
通過*號可以引用一個存儲單元,如有如下定義:
int i=123,*p,k;
則 p=&I;或k=*p;或k=*&I;都將變量i中的值賦給k。
*p=10;或*&i=10;都能把整數10賦給變量i。這里,等號左邊的表達式*p和*&i都代表變量i的存儲單元。
1.2 變量、數組、字符串、函數、結構體的指針以及指向它們的指針變量
1.變量的指針和指向變量的指針變量。
2.數組的指針和指向數組的指針變量。
所謂數組的指針是指數組的起始地址,數組元素的指針是數組元素的地址。
C語言規定數組名代表數組的首地址,也就是第一個元素的地址。
3.字符串的指針和指向字符串的指針變量。
我們可以通過定義說明一個指針指向一個字符串。
C語言將字符串隱含處理成一維字符數組,但數組的每個元素沒有具體的名字,這一點跟字符數組不一樣。要引用字符串中的某個字符,只能通過指針來引用:*(s+0),*(s+1),…,*(s+n)。
4.函數的指針和指向函數的指針變量。
指向函數的指針變量的一般形式為 :
數據類型標識符 (*指針變量名)();
這里的″數據類型標識符″是指函數返回值的類型。
函數的調用可以通過函數名調用,也可以通過函數指針調用(即用指向函數的指針變量調用)。
指向函數的指針變量表示定義了一個指向函數的指針變量,它不是固定指向哪一個函數,而只是定義了這樣的一個類型變量,它專門用來存放函數的入口地址。在程序中把哪一個函數的地址賦給它,它就指向哪一個函數。在一個程序中,一個指針變量可以先后指向不同的函數。
在給函數指針變量賦值時,只需給出函數名而不必給出參數。因為函數指針賦的值僅是函數的入口地址,而不涉及到實參與形參的結合問題。
對指向函數的指針變量,表達式p+n,p++,p--等都無意義。
5.結構體的指針與指向結構體的指針變量
一個結構體變量的指針就是該變量所占據的內存段的起始地址。可以設一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址。指針變量也可以用來指向結構體數組中的元素。
1.3 用指針做函數參數
函數的參數不僅可以是整型、實型、字符型等數據,還可以是指針類型,它的作用是將一個變量的地址傳送到另一個函數中。
1.4 返回指針值的指針函數
一個函數可以返回一個整型值、字符值、實型值等,也可以返回指針型數據 ,即地址這種帶回指針值的函數,一般的定義形式為:
類型標識符 *函數名(形參表);
1.5 指針數組、指向指針的指針
1.指針數組指的是一個數組,其元素均為指針類型數據,也就是說,指針數組中的每一個元素都是指針變量。指針數組的定義形式為:
類型標識 *數組名[數組長度說明]
指針數組可以使字符串處理更加方便。
2.指向指針的指針是指指向指針數據的指針變量,一個指向指針數據的指針變量的一般形式為:
類型標識 * *p;
1.6 main函數的命令參數
指針數組的一個重要應用是作為main函數的形參,一般來說,main函數后的括號中是空的,即沒有參數。實際上main可以有參數,如:
main(argc,argv)
其中,argc和argv就是main函數的形參。其他函數形參的值可以通過函數調用語句的實參中得到,由于main函數是由系統調用的,因而main函數的形參值不能從程序中得到,但可以在操作系統狀態下,將實參和命令一起給出,從而使main函數的形參得到值。命令行的一般形式為:
命令名 參數1 參數2…參數n
命令名和各參數之間用空格分隔開。
1.7 動態存儲分配
在C語言中有一種稱為“動態存儲分配”的內存空間分配方式:程序在執行期間需要存儲空間時,通過“申請”分配指定的內存空間;當閑置不用時,可隨時將其釋放,由系統另作它用。本節介紹C語言中動態分配系統的主要函數:malloc()、calloc()、free()及realloc(),使用這些函數時,必須在程序開頭包含文件stdlib.h。
1.主內存分配函數—malloc()
函數格式:void*malloc(unsigned size);
函數功能:從內存中分配一大小為size字節的塊。
參數說明:size為無符號整型,用于指定需要分配的內存空間的字節數。
返回值:新分配內存的地址,如無足夠的內存可分配,則返回NULL。
說明:當size為0時,返回NULL。
2.主內存分配函數——calloc()
函數格式:void*malloc(unsigned n,unsigned size);
函數功能:從內存中分配n個同一類型數據項的連續存儲空間,每個數據項的大小為size字節。
參數說明:n為無符號整型,用于指定分配的數據項的個數size為無符號整型,用于指定需要分配的數據項所占內存空間的字節數。
返回值:新分配內存的地址,如無足夠的內存可分配,則返回NULL。
3.重新分配內存空間函數——realloc()
函數格式:void*realloc(void *block,unsigned size);
函數功能:將block所指內存區的大小改為size字節的塊。
參數說明:block為void類型的指針,指向內存中某塊,size為無符號整型,用于指定需要分配的內存空間的字節數。
返回值:新分配內存的地址,如無足夠的內存可分配,則返回NULL。
4.釋放內存函數—free()
函數格式:void free(void*block);
函數功能:將calloc()、malloc()及realloc()函數所分配的內存空間釋放為自由空間。
參數說明:block為void類型的指針,指向要釋放的內存空間。
返回值:無。
【C語言中指針的概念】相關文章:
C語言中各種類型的指針的概念總結11-24
C語言的指針類型詳解10-17
c語言指針運用中堆和棧的區別04-27
怎樣學習c++c語言編程04-28
C語言入門知識07-20
C語言的編碼規范02-10
C語言的基本構成12-05
c語言的優點介紹04-13
C語言試題訓練10-20