為什麼C語言用int a 來宣告指標變數,而不是int a宣告?

時間 2021-05-29 23:13:03

1樓:

int *a = &b 等同於:

int *a;

a=&b;

也就是說:

*a型別是int,

反推出a是指標(位址),

a的值為b的位址。

2樓:Mandy

這是因為在型別描述和表示式中*的意義是不同的。型別描述中int*表示a的型別是整數的指標。而表示式中*是乙個運算子,表示對指標取值。

3樓:千景

int * a;有兩種解釋:1. int *a; 2. int* a;

1是語言發明者的解釋;2是現代使用和維護者更多的提倡解釋。

再來看看假設int & a = &b;

按照第二種方式int& a,用int&來硬性代表「指標」其實是可行的,也的確方便理解。

但按照第一種方式int &a,最終型別是int, 對取a的位址進行賦值。這樣a其實就是b。(這就是「引用」了)

所以,語言上這麼設計是因為發明者對語法和關鍵字的設計有自己哲學和邏輯。當然邏輯有難懂和易懂之分,介於c已經這麼「古老」了。

4樓:sunny

int &a說明a是乙個實體物件,a是乙個儲存在(邏輯上)記憶體裡的int,int *a說明a是乙個儲存在記憶體上的位址,這個位址所代表的記憶體段(segment中文是這麼說咩?)是乙個int變數。

所以其實這兩句意思不一樣啊~

5樓:靈劍

哎,這怎麼解釋……

按規定這個語句其實是

typedef

int*

INT_PTR

;INT_PTRa=

&b;這就看暈了那要是遇到

void(*

pfunc

)(int

,void(*

)(int))=

func

;這可怎麼辦……

定義的同時賦值這個語句在C當中只是把定義和賦值兩個語句合起來了而已,不管定義的是什麼型別,定義的型別寫成了什麼鬼樣子,都是一樣。

6樓:akuma

這兩*不是同乙個玩意。

int * a 中 a是乙個指標,指向儲存了型別為int的儲存空間。

*a 中 *是乙個操作符,取位址的儲存空間中的資料。

所以 a實際是乙個位址即&b,*a即是取b的值

7樓:James Swineson

這種簡單型別可以直接看前面部分……顯而易見地,*a 的型別是 int,很明顯它是個值而不是位址嘛。a 的型別是 int*,它才是位址。

C gibberish English 乙個把 C 變數定義轉成英文的東西

Clockwise/Spiral Rule 比較詳細,通俗易懂的語法解釋

8樓:李登淳

這在Cpp裡叫引用……

int* a中int*是乙個整體,和int是完全不同的兩種型別(我當然知道你能強制Cast)。&符號的意思為取址運算子,其結果為乙個記憶體位址。將乙個記憶體位址賦予乙個指標物件不是再正常不過的事情了嗎?

9樓:

* 和&一樣都是個運算子!

&是取位址,* 表示指標(位址)的間接引用&b取得b的位址

int *a =&b;

可以寫成

int *a;

a = &b;

*a表示通過指標(位址)a的間接引用取得b的值!

或者你直接把 *a理解成取得位址a處的值吧,那什麼位址的間接引用是機器語言的說法!

你列印下 *(&b)試試,理解有錯的話請見諒!

10樓:鐵氰化亞鐵

準確來講

int *a;

int* a;

都不太好

int * a;

就感覺差不多了

可以這樣解釋

宣告了乙個變數a, 是int型的指標(*), int * a = &b;是在初始化宣告出來的變數a使其初值為&b.

11樓:Alinshans

& 這個叫取位址符。

int a = 0; (1)

int *pa = &a; (2)

(1)是宣告乙個int型別的變數a,為其分配一塊位址,並把位址內容初始化為0。

(2)是宣告乙個變數pa,型別是int *,表示指向int型別,是指標變數。系統為pa這個指標變數分配一塊位址,取a的位址作為pa的值。*運算子是取記憶體中的值。

所以*pa = a = 0,pa = a的位址。宣告和運算時表示的含義不同。

12樓:doing

我覺得就不要給C語言洗地了,這塊就是沒設計好。

誠然我們可以這麼理解:int* a = &b;

但是遇到多變數定義怎麼破?int* a = &b, x = 0; 這個x怎麼解釋?int啊還是int*?

在上例*和a實際關係更緊密,和int反而遠了,這和一般人的直覺是不同的。

設計者的本意就是:*a是前面是型別int,故而*a是int,a自然就是int*,而附帶的賦值表示式是賦值給a而非*a - 這當然感覺有些操蛋(廢話,a還沒初始化,*a怎麼可能賦值),讓人費解。

雖然這讓初學者有些困惑,不過C語言本來就該讓所有人使用,這個特性可以當做傳銷過濾器,凡是不能迅速理解的就別學C語言算了。

ps:題主提的int &a也是不可取的,這個更反直覺。如果int不能定義多變數的話,目前的定義方式是非常符合邏輯的。

13樓:Harry Nu

換個思維就簡單了

int* a=&b;

a的型別為int* 是乙個指標,用&b來獲得b的位址(在記憶體的位置) 並賦值,所以a的值為b的位址。用*a來記憶體裡a的位置對應的值(b)

14樓:黃小非

題主你肯定是還沒有區分宣告和解指標的關係。

int * a = &b;

這裡從編譯器來看是這樣的:

(int *) a = &b;

注意(int *)是乙個型別,是乙個整體,它的叫法是「指向整形變數的指標型別」。這裡的int和*是不能分開的。

而你在定義了上述的a指標後,如果你再寫:

int c = *a;

這裡的*就不是乙個型別了,而是乙個「操作符」的概念,它的作用是,從a所指的位址讀出sizeof(int)那麼長的位元組(當然也就是b的值),然後賦值給c。

所以,int *和*操作符完全是兩個東西,明白了這個就好理解了

為什麼 C 語言被設計成函式需要先宣告才能被使用?

李鵬 理論上,完全可以做到不宣告,直接使用。但C語言非常古老,跟現在的高階語言相比,自然有很多原始的地方。對函式進行宣告的好處是,能夠簡化編譯器的開發。在最早的K R標準裡,函式的宣告不需要宣告函式的引數,只需要告訴編譯器函式名和返回值就可以了。這樣的話,在編譯器中,函式名被當做乙個指標,對編譯器來...

為什麼爬蟲非要用python?用C語言 C C 或者java不行嗎?

輪子決定語言熱門度,最近我用php做爬蟲,發現b站連php和xpath結合使用的教程都沒有,只有在網上找到零散的幾篇文字教程,入門教程都沒有這還怎麼學爬,最後自己還是鼓搗出來了,提取資料,查詢本方資料庫,重新生成頁面. 圓胖腫 我曾經用vert.x的web client做過爬蟲真的是很方便,可能是我...

初學習C語言用什麼軟體

如是我聞 初學C語言的話,我個人建議使用dev cpp這個軟體比較好,關鍵是她免費!免費!他能設定中文語言,再有就是頁面比較簡潔,適合新手小白,前期的話可以先試用這個軟體幾個月,然後慢慢的根據自己的學習情況再去挑選其他的學習軟體。 cently 軟體很多都可以用的,我初學的時候用的是VC6,這個軟體...