標籤:nbsp 分享 儲存空間 儲存 定義 個數 數組元素 不同的 計算
指標和指標變數
指標就是地址,地址是一種資料類型。指標變數也是變數,但只能存放地址類型的資料,可以稱為“地址型”變數。
1)記憶體單元和地址
一個程式運行時,程式本身和程式中用到的資料都要儲存在電腦的內部儲存空間中。內部儲存空間是由多個記憶體單元(位元組)組成的,每個單元都有自己專屬的,相互不同的地址,稱記憶體單元地址。
2)變數與地址。
char ch=‘A‘; short s =5; float f; 他們分別是1個位元組,2個位元組,4個位元組。(也就是記憶體單元)
如果出現這樣的指派陳述式“f=s+ch;”,操作過程是:
1.在變數地址對照表中找到變數a,取出s的地址(2010),考慮到其資料類型是短整型,所以從該地址開始的2個位元組中取出1個整數(5);
2。根據同樣的方法去除變數ch中的字元‘A’(想當於整數65),相加獲得運算式的值為70.
3.然後再變數與地址對照表中找到變數f的地址,考慮到其資料是單精確度型,所以將結果70轉換成單精確度實行的70.0,再存入變數f對應的4個位元組中。
以上操作,通過變數名查取變數的地址,再從變數對應地址的位元組中取得值或將某值存入變數對應地址的位元組中稱為直接存取方式,由於地址能起到尋找“操作隊形”的作用,就像一個指向“操作對象”的指標,所以常把地址稱為“指標”。
3)數組與地址
除了變數以外,程式中還可以用數組來存放資料。每個數組元素也要佔用連續的記憶體單元。一個數組佔用的總位元組數等於數組長度乘以每個數組元素佔用的位元組數。
在來源程式進行編譯時間,每遇到一個數組,按其資料類型和長度分配記憶體單元,同時在“數組與地址對照表”中記錄數組名、資料類型、數組長度、數組首地址。
例如這個語句 short a[3]={1,2,3};
在數組地址對照表中找到數組a,取出首地址,按公式計算出數組元素a[0]的地址:3210+0*2=3210,從該地址開始的2個位元組(3210、3211)中取出整數1;按相同的方法取出數組元素a[2](地址是3210+2*2=3214)中的整數3,進行相加,得到結果4.然後通過公式計算出a[1]的地址:3210+1*2=3212,再將計算結果4存入3212開始的2個位元組(3212、3213)中。上述操作中,通過查表獲得數組首地址,通過計算元素地址的方式先獲得元素的地址,然後通過這個地址取得元素的值,或將值存入元素的方式也是直接存取方式。
4)指標變數
先把要存取的變數的地址存入一個“特殊變數”,然後通過這個其值為地址的“特殊變數”來存取變數的值,這種存取方式由於通過一種存放地址的“特殊變數”來實現的,所以稱為間接存取方式。
這種存放地址值的“特殊變數”就是指標變數。
使用指標變數:
通過間接存取方式完成指派陳述式“a[1]=i*j;”的操作。事先將變數i、j和數組元素a[1]的地址分別存入指標變數p_i、p_j、p。以後的操作過程如下:先從指標變數p_i中取出i的地址,再從記憶體該地址中取出變數i的值;按同樣方法,通過指標變數p_j取出變數j的值進行相乘;再從指標變數p中取出數組元素a[1]的地址,將運算結果存入記憶體的該地址中。
指標變數的使用方式
1)給指標變數賦值
格式為:指標變數=地址型運算式。
取地址的運算子是“&”,運算對象是變數或數組元素名,運算結果是對應變數或數組元素的地址。
例如:變數 i 的地址應寫成地址運算式“&i”,數組元素a[1]的地址應寫成地址運算式“&a[1]”。
注意:雖然地址是一個整數,但是,在C語言中不允許把整數看成“地址常量”。所以這的“地址型運算式”不能是整數。
例如:int i , *p_i
p_i = &i //使指標變數p_i指向變數i,這的&i 就是地址型運算式。
p_i = 100; //企圖使指標變數p_i指向地址為100的記憶體單元,這是錯誤的。
2)直接使用指標變數名。
需要用到地址時,可以直接引用指標變數名。
例如:int i,j, *p=&i,*q;
q=p; //將指標變數p的值(i的地址)賦予指標變數q。
scanf("%d,%d",q,&j); //使用指標變數q接受輸入資料存入q指向的變數i。
3)通過指標變數來引用它所指向的變數。
使用格式為:*指標變數名。
例如:int i =1,j=2,k,*p=&i;
k=*p+j; //由於p指向i,所以*p就代表i,結果k等於3.
注意:取地址運算子的運算對象必須是已定義過的變數或數組元素,但不可以是數組名。運算結果是運算對象的地址。例如,定義了變數a,數組b[10],則&a,&b[0],&b[9]均合法,分別代表變數a地址,數組元素b[0]的地址,數組元素b[9]的地址;而&b則是錯誤的。
(未完。。。。)
4)C語言指標(C自考學習)