這些天筆試經常碰到指標的題目,故做了乙個整理。
指標在應用中的各種型別:
(1) int *ip; //(char* cp,float* fp,double* dp) 一級指標變數
(2) int **ip; //(char** cp,float** fp,double** dp) 二級指標變數
(3) const int* ip; //常量指標
(4) int* const ip; //指標常量
(5) const int* const icp; //常量指標常量
(6) int *ip[10]; //指標陣列
(7) int (*ip)[10]; //陣列指標
(8) int *f(int a); //char* copy(char* s1, char* s2) 指標函式
(9) int (*gp)(int); //函式指標
(10) int (*gp[10])(int); //函式指標的陣列
下面針對這11中情況作一一解說
(1) int *ip; //(char* cp,float* fp,double* dp) 一級指標變數
一級指標是我們接觸最多,也是最簡單的指標。
#include
using namespace std;
int main(void)
上面程式體現了二個問題:1)指標的增減運算 2)定義指標乙個*只能修飾乙個指標
指標的增減是以該型別的實體大小為單位的(但對指標作乘除是沒有意義的)
對char指標加 1 實際增加了1個位元組
對float指標加 1 實際增加了4個位元組
對int指標加 1 實際增加了4個位元組
定義指標乙個*只能修飾乙個指標
程式中的 ip是乙個指標,而iq是乙個整數變數
在很多c/c++程式,指標跟陣列進行替換使用,這樣以使得我們覺得指標跟數值是等價,但是陣列跟指標還是有很大區別的,請看下面的例子。
#include
using namespace std;
void fun(char a[100])
int main(void)
看了上面的例子之後,我們來說說陣列跟指標的區別:
陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。
指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。
字元陣列 a 的容量是 12 個字元,其內容為 hello world\0。a 的內容可以改變,如 a[0]= 『y』。指標 p 指向常量字串「welcome to c++」,(位於靜態儲存區,內容為 welcome to c++\0) ,
常量字串的內容是不可以被修改的。從語法上看,編譯器並不覺得語句 p[0]= 『x』有什麼不妥,但是該語句企圖修改常量字串的內容而導致執行錯誤,
所以我們經常把char *p = "welcome to c++" 寫成 const char *p = "welcome to c++",這樣就能夠使得 p[0] = 'x'語句在編譯的時候就報錯。
sizeof(a)的大小是12(注意別忘了\0) sizeof(p)是乙個指標的大小,當把陣列作為函式引數進行傳遞時,陣列自動退化為指標。
指標引數如何傳遞記憶體的?
#include
#include
using namespace std;
char* getstr1()
char* getstr2()
char* getstr3()
void getstr4(char *p, int num)
void getstr5(char **p,int num)
int main(void)
getstr1()輸出的是亂碼,因為在getstr1()裡return的是棧記憶體,所以當退出函式之後,char a也隨著被清除了。
getstr2()能夠正確執行。
getstr3()雖然能夠正確執行,但是不管在什麼地方返回都是常量資料
getstr4()執行結束後,str4仍然還是null,因為char *p引數在getstr4()函式執行結束後隨著也被清除了
getstr5()能夠正確執行。
(2) int **ip; //(char** cp,float** fp,double** dp) 二級指標變數
二級指標變數與一級指標變數的關係,跟二維陣列與一維陣列的關係有些類似,在這就不多說了
(3) const int* ip; //常量指標
(4) int* const ip; //指標常量
(5) const int* const icp; //常量指標常量
這3個有一些相似性,看如下例子。
#include
using namespace std;
int main(void)
(6) int *ip[10]; //指標陣列
(7) int (*ip)[10]; //陣列指標
指標陣列:顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已
陣列指標:指向乙個陣列的指標
#include
using namespace std;
int main()
; //指標陣列,陣列中的每個元素都是乙個指標
for(int i = 0; i < 3; i++)
cout << *p[i] << '\n';
int (*ap)[3]; //陣列指標
int arr[4][3] = ,,};
ap = arr;
for(int i = 0; i < 4; i++)
}(8) int *f(int a); //char* copy(char* s1, char* s2) 指標函式
指標函式是指函式返回值是乙個指標型別
如我們在c語言中經常使用strcpy就是這樣乙個函式
char* strcpy(char* dest, const char* src)
看到這函式,我們可能會覺得為什麼要有乙個返回值呢?不是把src的內容都已經複製到dest中了麼,這個主要是為了完成了鏈式運算,為了是strcpy函式能夠作右值。
(9) int (*gp)(int); //函式指標
(10) int (*gp[10])(int); //函式指標的陣列
#include
using namespace std;
void fun1()
void fun2()
void fun3()
int main()
指向指標的指標(整理)
乙個指標變數可以指向整型變數 實型變數 字元型別變數,當然也可以指向指標型別變數。當這種指標變數用於指向指標型別變數時,我們稱之為指向指標的指標變數,這話可能會感到有些繞口,但你想到乙個指標變數的位址就是指向該變數的指標時 這種雙重指標的含義就容易理解了。下面用一些圖來描述這種雙重指標,見圖6 13...
C 整理 const指標
c語言裡面const和指標的組合寫法經常令人困擾,想不起它真正表達的意義,而且這也是面試 筆試的時候重要考查的基礎知識。看下面三種定義 const int int const p int const p 前兩種定義表達的意思是一樣的 p指標指向的內容不被改變。最後一種表達的是 p指標的指向不被改變。...
C語言指標整理
記憶體是按照位元組編址的,所以它的定址單位是位元組 byte 而乙個位元組又有是由8位 bit 的0或1組成。所以這樣的話4gb記憶體的定址空間就從0x00000000到0xffffffff,總共有 明白記憶體位址後,指標實際上就是記憶體位址,指標變數則是儲存指標的變數,也即是儲存了記憶體位址。下面...