既然在變數前加乙個 就可以得到位址,為什麼還需要指標?

時間 2021-05-11 23:34:40

1樓:ARM7

&能夠取得變數位址,這當然很好,但在賦值時,它只能出現在等號右邊,不能出現在等號左邊,為了能對變數位址進行各種操作,產生了指標概念。

2樓:

位址的數值是無符整數,用整型就可以存,也能正常操作——前提是知道這個整數是乙個位址,所以指標存在的意義只是告訴這是乙個位址

3樓:這是乙個神奇的網名

在我看來,如果非要說不用指標的話,很多功能確實也可以完成,但是會非常麻煩,比如我直接用某個結構作引數會非常的冗雜繁瑣;

你可以把指標理解為引用,或者我們借用數學裡的乙個概念,「換元」,這樣我們就只有引用、讀取乙個位址,繼而達到間接訪問的目的。「換元」就大大提高了效率。而且指標訪問的是位址,在某些函式做返回值的時候也很簡便,間接訪問一下就出來了。

4樓:

很簡單。因為指標的存在並不僅僅是為了得到乙個物件的位址而已。

指標可以實現多型、傳址、對堆記憶體的精確控制等等等等&取得的只是乙個瞬時的位址,是不可以被修改的右值,強轉型別之後你得到的也只會是報錯。你想不到可以對它做什麼操作。

而指標存的位址是持久的,是被編譯器支援的,是很底層也很上層的東西。是能實現很多很多操作的。

等你學的更深入一點,你會理解的。指標的用處只有在實踐中才能體現出來

5樓:張星

是,指標是c的精華吧,c++的函式可以用引用來寫,已經很少用指標了,方便好多,但是指標這個概念是不能丟的,也有一些好用的地方,比如用short型的指標指向乙個int型的變數,便可以依次取出高位和低位,在一些DSP的應用上非常有用。

6樓:只增笑耳Jason

你可以理解&a得到的是乙個立即數,或乙個常量,它只能出現在運算表示式中,不可能出現在等號左邊。指標則是乙個變數,存放立即數或者常量的,可以出現在等號左右位置。當你要用它存放的位址時,你要用 *p。

其實 *p就是 a,p的值就是&a

7樓:雲天明

因為你要儲存這個量啊

比如var a = &b;

那麼這個var的型別,不能是int吧……只好用乙個新的型別表示這個var。

用pointer a = &b

這樣的寫法是可行的,但是這樣編譯器就失去了推斷*a的型別的能力,這樣的話程式設計師就必須在所有用到*a的場合手動指定*a的型別,這樣就很可怕

所以就需要這樣的寫法

pointerof(T) a = &b;//typeof(b) is T

而在C中確切的寫法是形如這樣的

T b, pointer a = &b;

就變成了

T b, *a = &b;

雖然更好的寫法是

T b;

T* a = &b;

8樓:Louis Tong

不是所有變數都是只有幾個位元組大,變數也可以是結構體,Windows API裡很多結構體比如WNDCLASS、OPENFILENAME常常有幾十甚至上百位元組,如果結構體直接用作RegisterClass()、GetOpenFileName()的引數,會很費力,所以用指標代替。

9樓:白彬

如果我們不需要函式的話,確實不需要指標。

如果你覺得需要有函式的話,就需要解決引數傳遞的問題。

有時候我們希望引數傳遞給函式之後,引數不會被改變,比如計算圓的面積,我們不希望程式把半徑給改了。這個時候我們就把引數複製一副新的,新的給函式內部用。

有時候我們希望函式能修改引數,比如希望函式能對陣列中每乙個數加1。這個時候複製乙份新的引數就錯了。

如何讓這兩種情況相容呢?答案是還是複製乙份新的,只不過第二種情況我們複製的是引數的位址。對相同位址上的資料進行修改也就等於是對引數的修改。

於是指標就誕生了。

10樓:

1.得到了位址,怎麼儲存這個位址,因而需要指標變數,變數儲存的內容是&取得的位址

2.指標變數,說明指標就是型別,類似於int型變數,int就是基本資料型別。具體解釋為指向某個型別的指標,int* pointer_to_int;

3.位址在記憶體就是幾個位元組表示,那麼,這個int* 為型別,int的作用體現在型別匹配以及位址操作中,如 pointer_to_int ++;

11樓:

既然=號可以獲取乙個變數或者常量的值,為什麼還要基礎資料型別?

問題的關鍵就在於,不僅要獲取,我們還有需求對其做更進一步的操作。

12樓:

因為指標變數有指向啊!指標指向變數,變數的位址被存到指標裡。

單純取完位址之後存起來後對存著位址的變數做任何操作也不能反饋到原變數身上,不能實現通過底層的位址操作來對變數操作。

13樓:劉賓

舉個例子,有乙個複雜的struct T

;比如我想列印msg的第二個元素,是這樣

T x;

...printf("%s\n", &x.msg[0][1]);

因為不能用指標,所以寫成初始取位址

這樣呢,我們每次列印這個x元素msg的第二個元素時,都要來一遍&x.msg[0][1],實際情況很多時候比這個還複雜,每次處理乙個值就需要從根上一路點下去,這明顯不是個供人類使用的方式。

我們直觀的感受就是,那我做個變數等於這個值,每次需要的時候就用這個變數吧,那麼我們會寫成這樣

char[256] tmp;

strcpy(&tmp[0],&x.msg[0][1] );

因為&tmp[0]這個東西是不能做左值的,所以需要寫成這樣

然後複製內容也是個大的效能槽點,為啥我不能直接用x裡那個內容,而要複製乙份,因為你寫不出來,沒有指標型別,這就寫不出我們希望的那個樣子。

可能有人會說用引用,

比如char[256] &tmp = x.msg[1];

但是很遺憾,引用是C++的內容,不是c的,其實引用不過是指標另外一種寫法。

如上,寫程式,需要指標型別,是個語言表達力的問題,是我們實際工作中確實需要的東西。

14樓:

&可以獲取變數位址,如果想存這個變數的位址怎麼辦?這個變數是什麼型別呢?如何定義這個變數?

怎麼使用這個變數?這就是指標型變數。指標型變數存的是位址,我們一般對位址(變數在記憶體的位置)不感興趣,一般是要取這個位址的上存的啥內容,需要運算子「*「」。

指標型變數還支援加法和減法。(這裡和陣列有異曲同工之妙)。

15樓:某人

在c語言中你知道乙個變數的位址又有什麼用,你必須能夠對位址所指向的記憶體空間進行操作,單純知道位址是無法對記憶體空間進行操作的,而指標就提供了對已知位址所指向的記憶體空間進行操作的途徑,你可以隨便給乙個指標變數賦予乙個位址值,理論上你就可以通過這個指針對位址所指向的記憶體空間進行操作,但最好不要這樣試,對未知記憶體空間進行改寫可能導致程式崩潰。

16樓:

前面我們都講指標初始化為變數的位址;變數是在編譯時分配的有名稱的記憶體,而指標只是為可以通過名稱直接訪問的記憶體提供乙個別名。指標真正的用武之地在於在執行階段分配未命名的記憶體以儲存值。在這種情況下,只能通過指標來訪問記憶體。

—— C++ Primer Plus

17樓:

明明只要加乙個負數就可以做到的事情,為什麼還要創造減法?

因為沒有指標,位址本身就沒有意義啊,沒有指標,位址就交給作業系統處理了,輪不到你處理了!

沒有減法,怎麼會產生負數!?

18樓:再會

想了一下可能有這個原因在裡面

比如int型指標p和long long int 型指標t吧p+1和t+1各自的位址跨度取決於int和long long int的儲存大小

而&操作符似乎只負責取位址不負責判斷所取的變數是什麼型別的。 也許可以增加&的功能吧...

所以我覺得首先要考慮的是運算的問題,不是儲存。儲存也是為了今後的運算。哪怕你只是取出來看一下那也是運算。因為compute r嘛..

19樓:張力

是啊,加個位址運算子就能得到位址,但是位址有什麼好的,最重要的是變數本身嘛,但是如果你只知道 &a,那麼請讀取&a後面一百位元組的值,依次儲存在乙個單獨變數裡面輸出,你怎麼操作?

20樓:莉特雅

我就問你取了位址放哪?

指標就是用來儲存位址的。

設type是型別,

type a;是個變數。

type *p;就是個指標。

指標是物件,用來儲存位址用的。指標需要指向物件的型別是因為指標移動的時候需要知道移動多遠。

p = &a;就是把a的位址放到p這個指標裡。&a作為位址放不下type型變數。因為位址也是個資料型別。

type*指向type型別。

類似的,將type*作為type則有

type**指向type*。以此類推。

當初C語言沒有引用傳遞,傳指標過去讓別的函式修改變數。

再說指標是個好東西。

沒有指標,我要你位址何用?

傳值?值很大(記憶體)咋辦?

21樓:Cosmo

指標是儲存乙個變數的位址的變數。它本身也有位址,而前面加*表示志向它存放位址的那個變數。這個變數和它本身的位址不一樣。不知道這樣說我能不能理解。

22樓:

我舉個例子,假設我需要從位址為0x1ffffabcd的地方讀取兩個位元組,在沒有指標的情況下怎麼操作?

大多數答案裡說的指標型別,還有指標運算之類,表示用引用一樣可以,參考所有沒有指標的語言。

23樓:

打個比方,傳統的掛鐘,那個指標總是可以指向不同的位置,以表明不同的時間,而表盤上的刻度都是靜止的,用指標可以指向你想要的位址,但是取表盤刻度的位址,總是不變的。

24樓:spygg

在面對冰冷死板的記憶體位址,怎麼能優雅而又高效的尋找到你放置的變數,甚至是函式,指標給出這麼簡單的解決方案了,你還想怎樣?至少我想不出第二個答案

25樓:

因為&拿到的那個值需要某個型別的變數來裝來操作啊,你的問題類似於說既然5,6,7,8都是整數,為什麼還需要int呢。

26樓:喬捷

&運算子得到的是位址常量,而指標是位址變數,所以為什麼要指標應該是個顯而易見的問題了吧?如果還不明白,那就問你有了1234,為什麼還要int變數

27樓:香草天堂

總要有個東西來表示像指標這樣東西的變數型別吧,一切為了方便

類似於你能接受int a這樣的宣告,那同樣a也只是存在於編譯器符號表裡的乙個記憶體位址別名啊,你也乾脆去了?直接寫位址?自己來處理各種型別大小?

操作?顯然不能嘛!你擼的是c,又不是01

回過頭,指標型別也只是乙個指向具體型別的變數,表面是獲取乙個位址就ok了,但你更不能忽略它是有型別的,這才是重點。&僅僅是獲取位址,賦給什麼型別的指標,才能最終解釋它的含義

28樓:

強答一波,很多時候並不能知道具體要操作的物件而只能通過指標來指代(指標的指向)。此外像鍊錶這種,利用指標可以非常方便地在鍊錶結構中移動,而如果沒有指標的話就只能用a0.next.

next.next.next.

next一直到想要的位置。

乙個男人具備什麼就可以結婚了?

Coral 男人不要談什麼潛不潛力股,潛水一輩子擱淺的算個屁。結婚前要有存款 跟你要有相同的興趣愛好 掙錢能力能符合你們消費能力 不一定愛運動,但要有自控能力 上海市劉澤洋律師 我覺得首先肯定事經濟實力,比如說,車子,房子,存款,另外就是有正當穩定的收入,比如說有個正常的工作,另外就是不要有陋習,比...

註冊乙個商標,按照流程註冊就可以了嗎? ??

福威標局 是的,基本上準備好要註冊的商標 營業執照 影印件 身份證 影印件 然後確定好要註冊的商品或服務類別,提交註冊繳費就可以了 奕迅 申請所需資料 1 需商標名稱或圖樣 2 註冊商標所要使用的商品或服務範圍 3 身份證明檔案 A.公司申請的 需公司營業執照影印件 B.個人申請的 需個體工商戶營業...

一顆精子加一顆卵子為什麼就可以變成乙個人?

秦淮浪蕩子 其實人類的本體就是大腦那一小塊!所有的味道聲音視覺觸覺,都是由大腦控制的,還有第六感,喜怒哀樂,恐懼和敬畏!所以我一直有乙個理論,沒有上帝沒有神,有的話,也不住在天堂,而是住在大腦裡。其他的身體部件都是寄生體,是附件,類似樹的枝幹樹葉。這些寄生體是只是為大腦服務的。說起來很可怕吧?我們的...