記憶體變數簡稱變數,在c語言中,每定義乙個變數,系統就會給變數分配一塊記憶體,而記憶體是有位址的。如果把計算機的記憶體區域比喻成乙個大賓館,每塊記憶體的位址就像賓館房間的編號。
c語言採用運算子&來獲取變數的位址,取位址符「&」,有點像地圖,找位址通過地圖,所以用「&」作為取位址符。請看下面的示例。
示例(book50.c)
/*
*/#include
intmain()
執行效果
注意:1)在printf函式中,輸出記憶體位址的格式控制符是%p,位址採用十六進製制的數字顯示。
2)book50程式執行了兩次,每次輸出的結果不一樣,原因很簡單,程式每次執行的時候,向系統申請記憶體,系統隨機分配記憶體,就像您去賓館開房,如果您不提前預約指定房號,每次得到的房間編號大概率不會相同。
datatype *varname;
datatype 是指標的基型別,它必須是乙個有效的c資料型別(int、char、double或其它自定義的資料型別),varname 是指標的名稱。用來宣告指標的星號 * 與乘法中使用的星號是相同的。但是,在這個場景中,星號是用來表示這個變數是指標。以下是有效的指標宣告:
int
*ip;
// 乙個整型的指標
char
*cp;
// 乙個字元型的指標
double
*dp;
// 乙個 double 型的指標
不管是整型、浮點型、字元型,還是其他的資料型別的記憶體變數,它的位址都是乙個十六進製制數,可以理解為記憶體單元的編號。我們用整數型指標存放整數型變數的位址;用字元型指標存放字元型變數的位址;用雙精度型指標存放雙精度型變數的位址,用自定義資料型別指標存放自定義資料型別變數的位址。
把指標指向具體的記憶體變數的位址,就是對指標賦值。
示例book51.c
/*
* 程式名:book51.c,此程式用於演示指標變數
*/#include
intmain()
執行效果定義了指標變數,並指向了記憶體變數的位址,就可以通過指標來操作記憶體變數(在指標前加星號*),效果與使用變數名相同。
示例(book52.c)
/*
* 程式名:book52.c,此程式演示指標的使用。
*/#include
intmain()
執行效果
在我們之前講的函式的引數章節中,book49.c演示了函式的引數傳遞,主程式呼叫funcld函式的時候,傳遞的是變數的值,現在把它修改一下。
示例(book55.c)
/*
* 程式名:book55.c,此程式演示函式引數的傳遞和指標
*/#include
// 宣告funcld函式,p是乙個指標變數
void
funcld
(int
*p);
intmain()
void
funcld
(int
*p)
執行效果
book55.c演示了函式引數和指標的使用,主程式把變數a的位址傳遞給函式funcld,funcld函式的引數p是乙個指標,接存放變數a的位址。在函式funcld中,根據指標中的位址直接操作記憶體,從而修改了主程式中變數a的值。
我們已經使用scanf函式很多次了,呼叫scanf函式的時候,需要在變數前面加符號&,其實就是把變數的位址傳給scanf函式,scanf函式根據傳進去的位址直接操作記憶體,改變記憶體中的值,完成了對變數的賦值。
空指標就是說指標沒有指向任何記憶體變數,指標的值是空,所以不能操作記憶體,否則可能會引起程式的崩潰。
示例(book56.c)
/*
* 程式名:book56.c,此程式演示操作空指標引起程式的崩潰
*/#include
intmain()
執行效果
段錯誤(core dump),就是程式崩潰掉了。
在c語言中,陣列占用的記憶體空間是連續的,陣列名是陣列元素的首位址,也是陣列的位址。
示例(book57.c)
/*
*/#include
#include
intmain()
執行效果
從以上的示例可以看出,陣列名、對陣列取位址和陣列元素的首位址是同一回事。在應用開發中,程式設計師一般用陣列名,書寫最簡單。
示例(book58.c)
/*
*/#include
intmain()
執行效果大家請注意,第一行輸出的每個位址的增量是1,第二行的每個位址的增量是4,第三行的每個位址的增量是8,為什麼會這樣?因為陣列cc是char型,乙個儲存單元是1個位元組,陣列ii是int型,乙個儲存單元是4個位元組,陣列ll是long型,乙個儲存單元是8個位元組,位址加1指的是下乙個儲存單元,不是數學意義中的1。
在應用開發中,位址的運算很重要,主要用於字串操作,在以後的字串章節中我將詳細介紹。
for(ii=0;*(str+ii)!='\0';ii++)//不要寫成這樣*str+ii
指向陣列的下ii個要這樣寫*(str+ii)
不能寫成這樣*str+ii
指標也是一種記憶體變數,是記憶體變數就要占用記憶體空間,在c語言中,任何型別的指標占用8位元組的記憶體(32位作業系統4位元組)。
printf
("sizeof(int *) is %d.\n"
,sizeof
(int*)
);// 輸出:sizeof(int *) is 8
printf
("sizeof(char *) is %d.\n"
,sizeof
(char*)
);// 輸出:sizeof(char *) is 8
printf
("sizeof(double *) is %d.\n"
,sizeof
(double*)
);// 輸出:sizeof(double *) is 8
輸出的結果都是8。
本章節介紹的知識已經包括了指標99%的用法,還有一些的知識點如指標的指標、函式指標等,這些概念難以理解,應用場景極少。學習的方法應該是循序漸進,等功力增長之後,那些複雜的概念其實也很容易。如果在這裡就把人搞暈了,就沒辦法繼續學習下去。
操作變數可以用變數名,也可以用變數的位址。
指標用一句話可以概括,就是用來存放變數的位址,是一種中間狀態的變數。
變數的位址是變數的位址,指標是指標,位址和指標之間的關係像水與水桶的關係,表達的時候要嚴謹一些,不要把位址說成指標,也不要把指標說成位址。
指標就這麼簡單,您自己不要把自己暈了就行。
1、編寫示例程式,把本章節的知識全部演示一遍,必須充分理解每乙個細節,指針對c/c++程式設計師極其重要,沒有指標,程式沒法寫。
2、系統會為變數分配記憶體,也會為常量分配記憶體,有記憶體就有位址,試試以下**,如果不能理解就跳過。
char
*pstr=
"西施"
;printf
("pstr=%p\n"
,pstr)
;printf
("pstr=%s\n"
,pstr)
;// 不會出現段錯誤(core dump)
strcpy
(pstr,
"楊玉環");
// 會出現段錯誤(core dump)
C語言指標
指標變數是包含記憶體位址的變數,它指向記憶體中的一塊區域,通過指標的值,可以間接訪問到相應的記憶體單元的資料,並做相應的修改。1 指標的定義和簡單使用 定義乙個指標變數和定義一般的變數類似,只需在變數名前面加乙個 對乙個指標變數賦值可以用取位址符 來獲取到乙個變數的位址,如果要獲得指標指向的記憶體區...
C語言指標
1 定義指標變數void change int n 格式 變數型別 變數名 定義了乙個指標變數p 指標變數只能儲存位址 指標變數p前面的int 指標變數p只能指向int型別的資料 int main void change int n 2 指標與陣列 陣列名其實質是乙個指標,但是它和普通的指標變數還是...
c語言指標
編寫程式,在主函式裡用指標陣列輸入六個字串,再用另乙個函式對這六個字串排序,並在主函式中輸出排好序的字串。include void sort char s,int n char temp for int i 0 ifor int j 0 jif strcmp s j s j 1 0 temp s j...