位址和變數的概念
指標作用:
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語言的掌握程度,其實指標並不是那麼高不可攀,只是紙老虎而...