-
1 # 薛定諤的貓老大
-
2 # HeloneTech
指標也是C語言裡面最有內涵的東西了,也是在它這個程式語言層出不窮的年代依然能穩立排行榜的原因。
對於學習C語言的同學,我的建議是剛開始入門的時候要不求甚解,意思就是說在學習程序中別拘泥於一些概念是否真的明白,先透過例程和書本講解明白這東西大概怎麼用,掌握其最簡單的用法,然後繼續把整個C語言學完。
等把整個C語言體系建立起來之後,再去研究那些之前不是很懂的東西,這個過程主要是透過自己做一些小專案,看很多的程式碼,總之動手實踐是最重要的,也是一個再認識的過程。
透過上面的學習,基本上能把所有的概念理解的差不多。很多時候你以為你學完了,也只是你以為的,C語言的東西看很多遍,每次看都會有不同的理解。
說回指標,指標可以理解為一個變數,如 :
int a=4;
int *p = &a;
那麼p就是一個指標,a是一個普通變數。a作為一個變數它儲存的值為4,而p作為一個指標變數,它儲存的是a的地址。為了驗證這一想法,可以透過一下程式碼檢視p儲存的值:
printf("%u", p);
你會看到一串很大的數字,這就是p變數儲存的值,這個值是a的地址。我們可以說p指向了變數a,那麼這個時候就可以透過指標p操作變數a,比如列印a的值:
printf("%d", *p);
它和一下程式碼具有相同的現象:
printf("%d", a);
這裡只是舉例,這種例子的操作在實際專案中沒有太大的意義,所以,想體會指標的作用和意義,就要多寫多看程式碼,時間長了就理解了,要有耐心。
補充: 32位系統指標變數佔4個位元組,64位系統指標佔8個位元組。從這裡也能看出64位系統有更大的定址空間,這也是早年32位windows系統不能支援超過4G記憶體條的原因。
-
3 # 瘋語者
可以這麼理解,有一層樓分割成很多倉庫,每個倉庫有個門牌號。記憶體就是這層樓,門牌號就是記憶體地址。然後你要找某個東西,你可能會先找門牌號,從第一個開始找。這時你人就是指標。假如你要找的是3號,你必須透過1號和2號。這時你雖然找的3號,但你在1號停下來,指標就對著1號,同理2號停下來就指到2號。。你不理解是因為你以為電腦很聰明,我找3號他不用經過12號,直接就跳到3號。低層其實很笨的,挨著遍歷的。比如乘法5*1000000低層運算會讓你吐血的。就是這麼笨。
-
4 # 日衝資訊 黃
傳值還是傳引用
當我們呼叫一個函式的時候,需要考慮是向函數里傳遞一個變數值還是傳遞變數引用的問題。如果不希望函式的內部處理改變外部的變數值,那麼就需要傳值也就是用變數名作為引數。如果希望函式的內部處理直接改變外部引數的值,那麼就需要傳引用,也就是把變數的指標作為引數傳進去。
地址跟指標的異同指標的值是一個地址,這是指標和地址相同的地方。但指標是有型別的而地址卻沒有。指標的型別的作用是讓指標運算可以按照其型別的大小移動指標。在C語言中以char為例
char a;表示a是個變數char *a;表示a是個指標,取指標指向的變數的值要用*a不管a是指標還是變數,&a都是a的地址。指標的應用指標最典型的應用就是做連結串列。連結串列是透過指標收尾相接連起來的陣列,由於可以從中間截斷再接上非常方便快捷,連結串列是C語言的一個特色。另外,還有函式指標,結構體指標,這些指標可以用來傳遞複雜的變數,特別是使用函式指標可以做出來很多巧妙的程式。
指標的弊端在定義指標的時候必須對指標進行初始化,也就是讓指標指向一個實際的變數,否則,極易因為指向錯誤記憶體而引起系統崩潰。C語言的指標給作業系統的記憶體安全帶來了不小的麻煩,因為它給駭客提供了窺視他人情報的手段。
總結一下,指標最主要的作用就是傳遞引用,在沒有指標變數的語言中也需要對值和引用做規定,比如,C#中使用關鍵字ref來表示傳遞的是引用,而Java的類只能傳遞引用。C語言的指標儘管難理解,但卻是最靈活的。抓住這一點,相信會好理解一點。
-
5 # 姓wang有錯嗎
指標(pointer)跟其他int,short,float,double一樣,就是一種資料型別,用來儲存儲記憶體地址。
回覆列表
存放變數地址的變數。當時學C語言的時候對這個理解的不是很透徹,直到學了彙編,接觸了更多的底層(雖然c底層已經夠多了)。所以如果實在理解不了的話,去簡單的學學彙編吧,挺快的。學完之後你對地址的概念就會了解的很透徹了,觸類旁通,指向函式的指標什麼的,其實也都差不多”。重點是理解C語言的編譯還有程式碼編譯之後的儲存的機制。