指標 C C 指標相關知識

2021-10-20 17:46:53 字數 3590 閱讀 9418

提到指標,需要聯絡到計算機的記憶體等相關的知識,這類理論知識我就不過多闡述了,可能比較枯燥,我會以實踐為主來分析指標。

但有沒有發現,字串型別也就是字元陣列的輸入,為什麼不用加這個&符號就可以呢?

#include

#include

using

namespace std;

intmain

(int argc,

char

const

*ar**)

;scanf

("%s"

, str)

;printf

("%s\n"

,str)

;return0;

}

因為這個字元陣列可以看做成乙個指標,具體的原因我們先放一放。

試想一下之前有沒有這樣的乙個經歷,也就是我們輸入乙個整形或者浮點型資料的時候,忘了加 & 符號,如下圖,結果編譯器沒有報錯,那是為什麼呢?(現在比較新的gcc可能會給出警告之類的)

int

main

(int argc,

char

const

*ar**)

最後輸出的a肯定是不對的。

那我們現在分析一下a的位址的值,格式化輸出%p可以列印位址。

int

main

(int argc,

char

const

*ar**)

結果為:

這下我們應該明白了,原來scanf從鍵盤輸入的值沒有賦給真正a的位址,而是給了0000…這個位址位置。

現在我們理解了&符號取位址的含義(當然不要和位運算裡的按位與運算弄混了)

下面我們回到剛才講的字元陣列為什麼輸入不需要加&。

我們先列印一下字元陣列str的位址和str[0]的位址,你就會發現有意思的事情了。

**如下:

int

main

(int argc,

char

const

*ar**)

注意,我們發現str、&str和str[0]的位址是一樣的。

下面我分別說明一下它們三者的含義:

str : 陣列第乙個元素的首位址

&str : 整個陣列的位址

&str[0]: 陣列第乙個元素的首位址

那麼這樣可以得出乙個結論,對於字串型別的輸入,我們也可以scanf("%s",&str[0]); 這樣也是正確的。(可以去試驗一下)

接下來我們來詳細使用一下指標,我們定義乙個指標變數p,為其賦值為null;

這樣它就是乙個空指標。

**:

int

main()

執行結果

根據執行結果不難發現它是乙個空指標,這樣定義乙個指標也是乙個比較好的習慣,避免程式**現野指標,也就是沒有明確指向的位址的指標。

下面我們來了解一下指標的使用,可以看一下**以及注釋:

int

main()

執行結果:

然後我們再做這樣的乙個操作,對p進行賦值,那麼a的值會變嗎?也就是加入這樣一行**

*p = 8; 那麼a的值是多少呢?如果你已經理解了位址,那麼就能猜出來a的值也是8了。

**如下:

int

main()

下面來分析一下用的比較多的,也就是指標與一維陣列:

乙個一維陣列在記憶體裡面的位址是連續的,假設乙個整形陣列a = [1,2,3,4,5] ,其在記憶體中的位址是連續的,而乙個int形的陣列佔4個位元組,因此假設a陣列首位址為0x00,那麼其元素的位址應該是逐漸加4遞增,如下圖。

**實現(因為%p輸出的位址的資料是16進製制的,比較起來不太明顯,我們可以用%d輸出指標的位址一樣能得出結論)

int

main

(int argc,

char

const

*ar**)

;printf

("%d\n"

,&a[0]

);printf

("%d\n"

,&a[1]

);return0;

}

執行結果:

下面是關於指標與一維陣列遍歷的相關**(一些解釋在注釋裡):

int

main

(int argc,

char

const

*ar**)

;int

* p =

null

;//指標p指向陣列a

p = a;

//列印陣列 a

for(

int i =

0; i <

5; i++

) cout << endl;

//因為指標變數 p 指向 陣列a的首位址,因此p也可以看做成乙個陣列

for(

int i =

0; i <

5; i++

) cout << endl;

//另一種利用遍歷陣列的方式 但是這種方式會更改位址,不建議使用

while

(*p)

return0;

}

執行結果:

現在我們理解了對於乙個指標,如果指向了乙個一維陣列,可以把這個指標看做陣列。

對於字元型的指標,需要注意的有一點,如果你讓乙個指標指向字串常量,那麼需要注意的是不要修改這個指標的值,建議用const char*

**如下:

int

main

(int argc,

char

const

*ar**)

如果要實現乙個字元指標輸入字串,那麼就需要開闢記憶體才能夠輸入(如果不知道malloc函式的用法,可以去查一下c++ api幫助文件)。

**如下:

int

main

(int argc,

char

const

*ar**)

對於一些指標的基本知識就分析到這裡,當然還有其他很多知識,比如函式指標,結構體指標等。

由於篇幅太長,只分析到這裡,以後需要的話再做深入分析,最好通過一些實際操作,對於一些基礎的題目,嘗試用指標來做,多進行分析,才能夠理解指標,靈活使用指標。

C C 指標 引用相關小知識

在乙個變數前面加上 就表示變數的位址。指標實際上是表示記憶體位址的乙個整數,它是乙個unsigned型別的整數。在c語言中,陣列名也可以作為陣列的首位址使用。使用指標變數作為函式引數 指標型別也可以作為函式引數對的型別,這時視為把變數的位址傳入函式。如果在函式中對這個位址中的元素進行改變,原先的資料...

指標相關知識

1.間接訪問操作符 int d a d與 d的區別 d為乙個指標,指向a的儲存位址 d為d指向位址中的值 即a的值 include includeusing namespace std int a 100 int d a d為乙個指標,指向a的儲存位址 d為d指向位址中的值。int main pri...

指標相關知識

int main 總結 所有指標型別在32位作業系統下是4個位元組 空指標 指標變數指向記憶體中編號為0的空間 用途 初始化指標變數 注意 空指標指向的記憶體是不可以訪問的 空指標 int main 野指標 指標變數指向非法的記憶體空間 野指標 int main 總結 空指標和野指標都不是我們申請的...