指標資料整理

2022-09-23 09:51:08 字數 3333 閱讀 2044

這些天筆試經常碰到指標的題目,故做了乙個整理。

指標在應用中的各種型別:

(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,總共有 明白記憶體位址後,指標實際上就是記憶體位址,指標變數則是儲存指標的變數,也即是儲存了記憶體位址。下面...