c語言中認識指標

2021-07-06 06:42:05 字數 4282 閱讀 1585

位址和變數的概念

指標作用:

1、表示複雜的資料結果(eg:鍊錶、樹、)

2、能動態分配記憶體

3、方便的使用字串

4、有效而方便使用字串

5、有效而方便的使用陣列

&&&呼叫函式的時候能夠獲得1 個以上的結果。

6、能夠直接處理單元位址等

總結:可以看到可以很直接的接觸到計算機的硬體的內容進行操作。

1、資料的儲存和讀取:

定義乙個變數,程式在編譯的時候,會給這個變數分配記憶體單元。

(依據:系統會根據程式中定義的變數的型別,分配一定的長度空間。eg:32位機,int分配2位位元組,char分配1位位元組,浮點型分配4個位元組,記憶體中每乙個位元組都有乙個編號,這個就是「位址」,位址標誌記憶體單元,而記憶體單元是用來存放資料的。)

程式:int i,j,k;

編譯的時候,分配記憶體:

2000,2001分配給i,

2002,2003分給給j,

2004,2005分配給k;

在程式中,一般是「通過變數名」來對記憶體單元進行訪問操作的。(程式設計師對變數以及方法的使用)

總結:從程式設計師的角度可以看到一種別名的方式,從計算機的角度上看是實際的操作。

eg:printf("%d",i);

(編譯的時候會將i這個變數,編譯成為乙個對應的位址)

找到i變數的位址(2000),從2000開始的兩個位元組取出資料,然後輸出。

scanf("%d",&i);

若是:k = i+ j;

將i(2000,2001)存放的值和j(2002,2003)存放的值進行相加,送到k所占用的記憶體位址為2004,2005的記憶體位址上。

這種變數位址訪問變數值的方式成為「直接訪問」方式。

總結:我們可以回顧乙個「微機」課程上的彙編的集中方式。

另一種訪問的方式:

簡介訪問:即為將變數的位址存放在另外乙個變數中。

(c語言中的型別變數的定義)c語言中,程式可以定義整形變數、字元變數、實型變數。

同時也是可以定義這樣的乙個變數的,就是用它來存放位址。

t_pointer = &i;所以這個時候的t_pointer的值就是2000(即為它的值就是i的變數的位址的起始位址2000);

下面來了解一下簡介方式進行對數值進行儲存:

先找到i的位址存放的遍歷t_pointer,然後從裡面獲取i的位址(2000),然後懂啊2000,2001裡面獲取相應的i的值。

這個就是中間多了乙個變數。**********==>(間接儲存(位址變數))

總結一下:i的變數

1)、直接方式,就是知道i它的位址,然後直接獲取i的值;直接通過i的變數的i的位址量進行對i的值得訪問。

2)、將i的變數的位址,存放到另外乙個專門是用來存放位址的變數中。所以在訪問的時候需要通過存放位址的-變數獲取到相應的的位址 ,然後通過位址來獲取i值。

(所謂的「指向」,就是存放記憶體的位址來進行相應的指定,這樣就可以通過這個變數來訪問它所指向的位址的位置。)

通常:我們經常會說,通過位址指向能夠找到所需要的單元,可以說位址指向待單元變數。

區分指標變數和指標:

eg:變數i的指標是2000,而不能夠說i的指標變數是2000,i的指標變數是t_pointer。明白啥為變數。

3)、指標就是乙個位址,而指標變數就是乙個存放位址的變數。、

再一次總結:

(1)指標(位址)同意概念,指標變數就是存放位址的變數。

(2)直接儲存不存在指標變數的問題,而間接儲存需要涉及到變數。

變數的指標和指向變數的指標變數

變數的指標就是變數的位址,存放變數的位址的變數就是指向變數的指標變數。

為了表述指標變數和 它所指向的變數的關係,可以使用「*」來表示。

eg:(*t_pointer )是t_pointer所指向的變數。

i = 3;

*t_pointer = 3; 即為:將3賦值給指標變數t_pointer所指向的變數。

1、定義乙個指標變數

(c語言(強型別語言)固定每乙個變數在使用之前必須先定義,指定型別,並且按此來分配記憶體單元)

指標變數定義為指標型別。

eg:一般的:int i,j;  //定義兩個整形變數i,j

指標的: int *t_pointer_1,*t_pointer_2;//定義兩個指標變數,

指標型別中:左端的int是在定義指標變數的時候,必須指定的「基本型別」,指標變數的「基本型別」用來規定了指標變數可以指向的變數的型別。上面的兩個指標可以指向基本型別為int的,而不能夠指向浮點型別的資料。

第一的格式:

基本型別 * 指標變數名;

eg:float * pointer_3;

char * pointer_4;

指標變數之間的的賦值。

如何使指標指向另外乙個變數呢?

eg:t_pointer_1 = &i;

t_pointer_2 = &j;

所以:將變數i的位址存放在指標變數t_pointer_1中,因此,pointer_1就指向了變數 i;j也是同樣。

這個時候*t_pointer_1 就表示是i的值。

定義指標變數的時候注意兩點:

(1)指標變數的前面的「 * 」表示該變數的型別為指標型變數。指標變數名是t_pointer_1,而不是(*t_pointer_1),這個和其他的基本型別的定義不同。

(2)定義指標變數的時候,必須指定基本的型別。

原因:不同的基本的型別,指標所指向的位置的移動等等操作是不一樣的。

eg:如果指標指向的是「整形變數」,那麼使「指標移動乙個位置」意味著移動2個位元組;使指標+1 意味著位址的值加2個位元組。如果指標-指向的是浮點型,那麼指標增加的不是2而是4。

同時,指標變數只能夠指向一種型別的變數,不能夠指向其他型別的變數。

下面的錯誤的例子:

float a;

int *pointer ;

pointer = &a;(錯誤的)

總結:1)、指標變數的定義以及符號「*」的含義。

2)、定義指標變數的時候定義好基本的型別,並且一種型別的指標只能夠指向它當前型別的指標,可以聯想指標的增減操作。

2、指標變數的引用

兩個有關的運算子:

(1)& :取位址運算子

(2)* :指標運算子(或者「簡介訪問」運算子),取其指向的內容。

eg:&a 為變數a的位址,*p為指標變數p所指向的儲存單元的內容(即:p所指向的值)。

eg:如下**

#include void main()

結果:100,10

100,10

說明:(1)&*pointer的含義是什麼?(pointer是指標變數)「&」和「*」兩個雲算符的優先等級是相同的,但是按照自右邊而左邊方向結合。因而先進行*pointer,在執行&,相當於&(*pointer)一般是這樣寫,結果即為:a的位址。

即為上面的兩個是等價的。

(3)(*pointer)++ 相當於a++,括號是必要的。沒有括號為:*pointer++ (++ 和* 是等級是相同的),結合運算是自右向左的。所以相當於*(pointer++)。由於++在pointer的值是改變的,這樣pointer不再指向a了。

**:#include void main()

{ int *p1,*p2,*p,a,b;

scanf("%d,%d",&a,&b);

p1 = &a; p2 = &b;

if(a1)、指標變數的使用,注意它的的操作符號。

2)、指標的變數操作的時候,改變的是指標變數中存放的位址。而不會直接去改變它所指向的變數的值,像上面。

除非使用*符號來獲取值進行改變。

3、指標變數作為函式的引數

函式的引數不經可以是整型、浮點型、字元型等資料,還可以是指標型別。

**:#include void swap(int *p1,int *p2);

int main()

{ int a,b;

int *pointer_1,*pointer_2;

scanf("%d,%d",&a,&b);

pointer_1 = &a;

pointer_2 = &b;

if(a總結:

(1)指標變數作為引數,同樣是「值傳遞」,單向傳遞。不過這裡傳的是指標的值。

(2)函式只可以返回乙個值,而指標作為引數,可以對多個值的改變。是通過指標變數所指向的變數的值的而改變。

總結(1)知道指標、位址、指標變數等等概念。

(2)指標的定義以及符號的使用

(3)指標作為函式的引數進行傳遞,可以改變多個值。解決了乙個函式只能夠返回乙個值的作用。

認識C語言指標(一)

說到指標,就會出現一些複雜型別,如果對這些複雜型別不太了解,在用到指標有時就會比較懵。乙個型別裡面會有很多運算子,其優先順序和運算優先順序一樣,只需要遵循乙個原則 從變數名處起,根據運算子優先順序結合,一步一步分析 先來看看簡單的型別 int p 這是乙個普通的整型變數 int p 先從p處開始,先...

C 語言中的指標

指標是 c 語言中的精華,正確靈活的運用指標,可以表示複雜的資料結構,動態分配記憶體,方便使用字串和陣列,呼叫函式返回多結果,直接處理記憶體單元等等。位址就是記憶體的編號,如果拿旅店作為記憶體,那麼每個房間號其實就相當於位址了。當程式編譯時,就會對變數分配記憶體單元,分配時按變數型別分配大小。經過編...

C語言中的指標

隨著程式語言的越來越多,但c語言在程式語言中的地位似乎始終沒有改變,其中得益於c語言中的指標,可以直接去操作記憶體位址與暫存器,執行效率也高,在嵌入式領域運用得尤其廣泛。對於初學者來說指標是c語言中很難翻越的一座大山,指標的掌握程度直接關係到c語言的掌握程度,其實指標並不是那麼高不可攀,只是紙老虎而...