當前位置:才華齋>計算機>C語言>

C語言中指標的概念

C語言 閱讀(2.44W)

在資訊工程中,指標是一個用來指示一個記憶體地址的計算機語言的變數或中央處理器(CPU)中的暫存器(Register)。下面是小編為大家整理的C語言中指標的概念,歡迎參考~

C語言中指標的概念

 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型別的指標,指向要釋放的記憶體空間。

返回值:無。