提到指標,需要聯絡到計算機的記憶體等相關的知識,這類理論知識我就不過多闡述了,可能比較枯燥,我會以實踐為主來分析指標。
但有沒有發現,字串型別也就是字元陣列的輸入,為什麼不用加這個&符號就可以呢?
#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 總結 空指標和野指標都不是我們申請的...