C語言開始學指標之後覺得很暈,怎麼都無法理解,有什麼好辦法繼續學下去?

時間 2021-05-30 15:17:11

1樓:「已登出」

記憶體: 一座女生宿舍

指標: 門牌號碼

char* p = "abcd";

此時, abcd這四個妹子就在女生宿舍的某個房間內, 門牌號就是指標p, 想去拜訪一下這個房間, 就需要用門牌號來找到它, 所以可以printf(p), printf這個函式就是臺望遠鏡, 按照門牌號, 就可以看到房間內的所有妹子.

因為指標表示門牌號, 所以按照指標, 你就能到房間門口, 那麼房間內的每乙個妹子怎麼找? 可以 char a = *(p + 0), char b = *(p + 1), 也可以 char a = p[0]; char b = p[1]; 所以++p就把指標從指向門口的a妹子移動到了指向b妹子, 以此類推, 操作指標就是讓指標指向你喜歡的妹子而已.

2樓:yihonge

之所以無法理解,我想是因為指標概念無法和以前所學的知識關聯。其實暫時只需要了解個大概就行,隨著學習的深入和能力提公升,當遇到某些場景不得不用指標或者使用指標會帶來提公升等,你就會慢慢理解的。

3樓:九曲闌干

開始學習不理解太正常不過了。想要對指標完全理解,需要經歷三個階段:

第二階段:指標的本質就是位址,需要對程式執行時記憶體有深入的理解,比如全域性變數的存放,malloc的儲存區在何處,執行時堆,執行時棧等等的理解。《深入理解計算機系統》一書中有深入的講解。

這部分理解需要花費一些精力。

第三階段:對計算機的虛擬儲存系統的理解,乙個編譯好的程式,存放在磁碟上,載入到計算機記憶體中執行,整個過程涉及作業系統對記憶體系統的管理,需要對計算機體系結構,作業系統有比較深入的理解才可以。

注:C語言語法知識並不多,但是從C語言為了編寫Unix系統而誕生,因此C語言的很多特性是為了編寫作業系統而設計的,完全深入理解需要貫穿計算機系統的學習。

4樓:攻城師

這麼晚了我就打點字吧

int num = 1;

int *p = #

這裡解釋下 p裡面存的是num的位址也就是存放1的位址 ,你可以想象p是一張紙裡面記錄了num的位址, 那麼我要想通過p找到num這個位址裡面存的東西我會怎麼樣我騎個車子根據紙裡面記錄的位址去找這個車子就相當於*,*p就相當於騎著車子按照紙裡面記錄的位址去找,騎到了num位址後發現原來這個位址有個1在裡面睡覺那麼*p就等於1是不是,同樣的二級指標也就是騎兩次車子的事第一次騎到地方一看這裡存的是乙個位址(不是睡覺1了是位址) 那麼根據這個位址再騎著車去找就找到了

學指標你得會冥想思維理清強制自己給自己解釋可不要只可意會不可言傳

5樓:

不理解指標也沒關係。。知道幾個常用的用法就行。

inta[8

];int*p

=a;p

++;p[

0];//這是a[1]

另乙個用法

void

foo(

int*x)

inta=1

;foo(&

a);//現在a變成2

指標的指標

//看做int的指標就行

鍊錶,指標表示引用

struct node

指標這個概念從型別的角度理解就行了,不一定要牽扯硬體。

6樓:「已登出」

int *a = 1000;

a是乙個位址,這個位址上存了乙個整數,值是1000

*a代表的就是那塊位址上存放的那個東西,也就是1000

7樓:

現在我轉其他語言發現沒有指標各種暈。(逃

===int a = 233;

int *b = &a;

b = b+1;

int c = *b;

int **d = &b;

a 是你家

b 是你家位址

b+1 是你家隔壁位址

c 是你隔壁家

d 是寫著你家位址的紙條的位置的座標(這樣就能無限迴圈了

8樓:

#include

int main(void)

實際上&就是「獲取變數位址(變數名)",而*就是「寫入資料(變數/記憶體位址)」,其中在*p為int的情況下,&(*p)=*(&p)=p。

9樓:

前面的前輩已經說的很好了,還是補充一下下。

指標就類似鐘錶指標的意思,指向某個地方,就是指向位址,變數的位址。int a=1;a儲存在計算機內部的位址,通過呼叫這個位址也能知道a被賦予的值1。

&取位址;*解引用,我都默默叫它取內容符號。

指標和陣列用的比較多,陣列的名字就是位址,首位址,字串的第乙個字母也是位址,計算機查詢資料的依據,一般16進製制。

指標可以用在傳遞函式改變原始函式的值,不用指標不好改變,指標用來表示陣列元素,等等很多的作用。

我開始學C語言的時候,有個內容怎麼看也不懂,看不下去,還是看下去了,第二天再一看,原來這個意思,事半功倍,很容易學會了。

10樓:紫荊沒有土豆泥

初學指標的話,乙個是要明白指標的本質就是指向變數位址的乙個東西。計算機中的資料被分配到記憶體中都存在著乙個位址,指標就是指向這個位址而不是指向位址之後的那個資料。第二,理清陣列和指標的關係。

對於一維陣列int a,我們說這個陣列裡面可以儲存五個整型數,這五個數被儲存時都有相應的位址,而且這五個數的位址是相鄰的。比如a的位址是2000,a的位址就是2001,以此類推。a就是乙個指標,它指向的是這個陣列首元素的位址,也就是a的位址,就是2000。

而a+1就是a的位址,就是2001。所以a的值可以用*a來表示,a的值可以用*(a+1)來表示。對於二維陣列char a,可以把它理解為乙個陣列a,他的每一行都是乙個陣列,每個陣列有四個元素,就是有四列。

這個時候,a仍然表示陣列a首元素的位址,而這個時候a首元素也是乙個陣列,我們稱之為陣列b,這個陣列在第零行,所以a就是第零行的位址,那麼相應的a+1就表示第一行的位址。這個時候*a表示的是陣列b,怎麼表示陣列b呢?當然是通過指標,因此*a就是b,是陣列b的位址。

**a就是*b,也就是b的首元素。同理可以知道,*(*a+1)就是*(b+1)就是b的第二個元素。

11樓:WnagoiYy

其實最好的理解是先學習一下計算機記憶體原理部分,推薦一本書《編碼隱匿在計算機背後的語言》 書不難很快就能看完

要理解指標就要理解位址,要理解位址就要理解位址是個什麼玩意。首先計算機中的資料都是放在儲存器裡面。

計算機儲存器8位為乙個位元組每1位都是相同的電路組成,用以儲存乙個0或1

如圖,每一位叫做鎖存器:

而為了方便,把8位看做乙個位元組,於是乎每乙個位元組由8個相同的鎖存器組成:

我把資料存到計算機好說,可以隨便存,但是如果我要取來用,就需要找到他放在哪個鎖存器開始,就這樣,給每個位一串數字代表用以訪問的時候索引,這個數字就叫做位址,假設你要找0x7c00這個位址,計算機就會根據數字然後順著電路查詢到相應的位置。

接下來說什麼叫做指標,指標就是位址。這句話就夠了。

【例1】:

int b=10;//宣告乙個int型別。宣告乙個變數就相當於申請一段儲存空間,乙個儲存空間你要讓我想辦法找到它,好吧就給你乙個起始位址(因為一段儲存空間不止一位,所以給儲存的起始位址來索引)。這個位址就是乙個數字,假設我們這裡的數字是0x22FF4C,這個數字就是b的位址。

int *a;//這裡是幹什麼呢,就是宣告乙個指標變數,怎麼說呢。指標變數儲存什麼,儲存的是指標啊,也可以說是儲存位址,也可以說儲存乙個數字。這個數字代表計算機中儲存器的位置,所以不管是int *還是char *都是同樣大小寫一段空間。

(注意這裡的型別是int *,不是int,a只能用來儲存乙個位址)

a=&b;//&b是什麼,&b就是取b的位址(起始位址),b的起始位址是多少?是0x22FF4C,然後我們把這個數字賦值給a變數。,現在a就是0x22FF4C數字了。

當然a是一段儲存空間,也有它自己的位址。

//好了我們a裡面儲存了b的位址。a和那個位址數字是等價的。然後我們通過a訪問b怎麼辦?

*a = 11; //*a就是訪問指標a(獲取指標a指向位址的資料)。也就是說讀取a儲存位址的那段空間,我們這裡對0x22FF4C這個起始位址,占用空間大小為 int資料型別的位元組長度這段空間賦值(這句話著重理解)。我們列印b的值就會發現其變成了11,這是因為我們通過a的數字修改了對應的空間。

題外話:在這裡可以做個試驗,把a強轉為char* 再輸出為char型別(不演示了)

【例2】:

int b=10;

//我們假設知道執行之後b的位址就是0x22FF4C起始位址空間段一直不變。

//我們來不通過變數直接改變b的值,該怎麼辦?

*((int *) 0x22FF4C) =11;

//列印b就會發現變成了11,為什麼呢,因為我們對0x22FF4C這個數字首先(int *) 0x22FF4C強行轉為乙個位址(指標)。乙個int*型別。對0x22FF4C轉為指標之後我們用*((int *) 0x22FF4C) 訪問指標運算子訪問這個數字代表的記憶體空間賦值為11,正好這個空間是b的空間。

這樣b就改變了。

上面的例子說明了指標的本質,而對於指標的指標,陣列指標等等,不過是指標本質複雜的演化。這方面的掌握只有多加練習,多加思考才能理解。都可以在c語言中實踐。

人之患,好為人師。對於說明不對或者不到位的地方請多加指正,很多地方都是自己的理解,沒有官方的語言。

題外話:有興趣的可以研究實現乙個作業系統,這會對底層的理解上公升乙個層次,不過作業系統的實現還真沒什麼好書,

《30天自製作業系統》工具老,層次不夠清晰,無奈棄。

《零基礎實現作業系統》彙編太多,抽象不夠,啃到保護模式轉實模式就很蛋疼了,無奈棄。

希望有志之士很寫出類似《編碼隱匿在計算機背後的語言》這樣通俗易懂的書。

有哪些開始覺得很難背 但記住之後覺得詞真美的詩句

煮海為鹽 難背 但是背過之後又會覺得很美的文章非駢文莫屬了。題主已經提了 千古第一駢文 滕王閣序 這裡就不再贅述 曹植的 洛神賦 辭藻也很華美,敘事更是細膩動人,因此才會有謝靈運 天下才有一石,曹子建獨佔八斗 的評價。然而我卻並不喜歡 洛神賦 這種愛情故事,這裡給題主力薦一篇唐代李華的 弔古戰場文 ...

剛開始學程式設計,而且現在是剛開始學C語言,要不要裝Linux系統?

Linux技術猿 看你個人喜好了,Linux和Windows上都能學習。Windows上你可以安裝Borland C 編譯軟體,或者你可以安裝微軟的VC 你也可以使用Cygwin,乙個在Windows裡虛擬Linux控制台環境的軟體,很多Linux上的指令通過Cygwin都能在Windows上實現。...

不是很喜歡工作內容,覺得很枯燥,覺得學不到東西,我還應該繼續做嗎?

屈魔人 任何工作都有改善空間,都可以培養你的可遷移思考能力。你之所以覺得學不到東西,是因為乙個詞 熟視無睹。我們經常會遇到這麼一件事情,老員工做了好多年沒發現的問題,新員工一來就另闢蹊徑,找到一條更好的改進方法。因為老員工思維固定住了嘛,新員工他可以天馬行空,思維不受條條框框的限制。煮雞蛋這件事情看...