指標是c語言的一種資料型別,類似於c中的其他型別,例如int ,char 等。既然指標是一種型別,當我們定義該型別變數,該型別變數就稱為指標變數。
c語言指標是乙個特殊的變數,其裡面儲存的數值被解釋成為記憶體裡的乙個位址。
在計算機中,所有對資料的操作,都是通過其位址進行的,指標讓程式的效率更高,**更少。
在學習指標的時間,一定要理解並區分指標的四個感念:指標的型別,指標所指向的型別,指標的值,指標本身所佔據的記憶體區。
指標變數定義的一般形式:型別說明符* 變數名。 型別說明符:表示該指標變數指向的變數的資料型別,並且該指標變數只能指向該資料型別的變數。這是指標變數的特徵。
*:表示該變數的指標變數。這也是指標變數的特徵。
變數名:表示指標變數的名稱。
例如:char *pstu; *表示pstu是乙個指標變數,char是指標變數pstu指向的變數的資料型別。整個語句表示定義了乙個指向char型別變數的指標變數。但具體pstu指向哪個char型別的變數,這就要看在使用pstu時,給pstu賦予的值,值是什麼就指向哪。
講指標不得不說的兩個運算子。取位址運算子&和取值運算子*。通過取位址運算子&可以獲得某個變數的位址,用取值運算子可以獲得某個位址中存放的資料。
指標變數使用前,先定義,給指標初始化以後,也就是賦值以後才能使用。在賦值時只能賦相容型別的值。
例如: #include
#include
void main()
從列印的值完全可以理解記憶體中存放的是什麼。
簡單修改:
#include
#include
void main()
指標與整數的加法。主要用於陣列中。
int arr = ;
int *pnew = arr;
pnew++;
pnew = pnew + 2;
陣列名就是第乙個陣列元素的位址。 int *pnew = & arr[0];
pnew = pnew + 7; pnew的指向已經越界,具體指向不知道,可能是已存在的位址或未知位址,在使用值是會發生未知的錯誤。在使用指標操作時,一定要注意是否超出了陣列的大小。
宣告乙個指標。指標變數是變數。
陣列指標:和指標變數用法基本一樣。
指標陣列:一系列指向同一資料型別的指標變數的集合,稱為指標陣列。指標陣列的所有元素都是指標變數。它們必須具有相同的儲存型別,必須指向相同的資料型別。
型別說明符 *陣列名[陣列長度];
例如:int *arr[5];
char *str = ;
—)常量指標(指向可以修改,指向對應的值不可以修改)
常量是形容詞,指標是名詞,以指標為中心的乙個偏正結構短語。這樣看,常量指標本質是指標,常量修飾它,表示這個指標乃是乙個指向常量的指標(變數)。
指標指向的物件是常量,那麼這個物件不能被更改。
在c/c++中,常量指標是這樣宣告的:
1)const int *p;
2)int const *p;
常量指標的使用要注意,指標指向的物件不能通過這個指標來修改,可是仍然可以通過原來的宣告修改,也就是說常量指標可以被賦值為變數的位址,之所以叫做常量指標,是限制了通過這個指標修改變數的值。
例如:int a = 5,b=6;
const int *c = &a; // 這是合法的,非法的是對c的使用
c = &b; //合法
*c = 6; // 非法,但可以這樣修改c指向的物件的值:a = 6;
const int *d = &b; // b是常量,d可以指向b,d被賦值為b的位址是合法的
二) 指標常量(指向不可以修改,指向對應的值可以修改)
指標是形容詞,常量是名詞。這回是以常量為中心的乙個偏正結構短語。那麼,指標常量的本質是乙個常量,而用指標修飾它,那麼說明這個常量的值應該是乙個指標。
指標常量的值是指標,這個值因為是常量,所以不能被賦值。
在c/c++中,指標常量這樣宣告:
int a;
int *const b = &a; //const放在指標宣告操作符的右側
只要const位於指標宣告操作符右側,就表明宣告的物件是乙個常量,且它的內容是乙個指標,也就是乙個位址。上面的宣告可以這麼讀,宣告了乙個常量b,它的值是變數a的位址(變數a的位址,不就是指向變數a的指標嗎)。
因為指標常量是乙個常量,在宣告的時候一定要給它賦初始值。一旦賦值,以後這個常量再也不能指向別的位址。
雖然指標常量的值不能變,可是它指向的物件是可變的,因為我們並沒有限制它指向的物件是常量。
因此,有這麼段程式:
char *a = "abcde1234";
char *b = "bcde";
char *const c = &a;
下面的操作是可以的。
a[0] = 'x'; // 我們並沒有限制a為常量指標(指向常量的指標)
或者*c[0] = 'x' // 與上面的操作一致
三)指向常量的指標常量(指向不可以修改,指向對應的值也不可以修改)
顧名思議,指向常量的指標常量就是乙個常量,且它指向的物件也是乙個常量。
因為是乙個指標常量,那麼它指向的物件當然是乙個指標物件,而它又指向常量,說明它指向的物件不能變化。
在c/c++中,這麼宣告:
const int a = 25;
const int * const b = &a;
函式指標:函式指標是指向函式的指標變數,即本質是乙個指標變數
資料型別(*變數名)();
int (*f) (int x); /*
宣告乙個函式指標*/
f=func; /* 將func函式的首位址賦給指標f */
指標函式:指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標。
以上僅僅是指標的簡單介紹。有關指標的複雜用法,以後再說。。。
C語言指標講解
1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不能夠是變數,也不能夠直接用整型位址值 可是int p 0 除外,該語句表示指標為空 此時,p僅僅是表示定義的是個指標變數,並沒有間接取值的意思。比如 int a 25 int ptr a int b 10 int point b ...
C指標 故事講解
關於c語言的指標,說指標是c的靈魂.重學一遍c的時候,感覺有很多收穫.何為指標呢?其實指標就是儲存變數的位址.這似乎難理解,位址,我們 平時遇到的位址一般是指乙個明確的地圖上的乙個指標或者是一串明 確的資訊,在哪個地方的哪個小區的哪個單元房.在計算機體系裡面,地 址就是資料儲存的地方.講乙個案例.i...
C語言中的函式指標學習講解
函式在記憶體中有乙個物理位置,而這個位置是可以賦給乙個指標的。一零點函式的位址就是該函式的入口點。因此,函式指標可被用來呼叫乙個函式。函式的位址是用不帶任何括號或引數的函式名來得到的。這很類似於陣列位址的得到方法,即,在只有陣列名而無下標是就得到陣列位址。1.怎樣說明乙個函式指標變數呢 為了說明乙個...