這個列指標的等價表示怎麼推出來的

時間 2021-05-30 00:10:58

1樓:邱昊宇

這就相當於你跑去天主教會問天父、天兄、天嫂是怎麼回事……

不要嘗試去理解這種漏洞百出的自創術語。現在天怪冷的,把這書燒了取取暖吧。

2樓:

少看這種爛書。學C語言,只推薦一本:《C程式語言》;學C++,也只推薦一本:

《C++ Primer》。這才是好書,被譽為聖經。這兩本書中沒提到的概念,那是爛書作者自己發明的,比如列指標是個什麼鬼?

C/C++高維陣列按行儲存,說行指標確有這個東西,何來列指標?給你乙個所謂列指標,你能直接通過它訪問一列元素?

回過頭來解答你的疑問。書中所謂列指標,其實就是某個特定元素的指標,int *。往根上說,int a[10][20],這個陣列到底是什麼型別?

老師教我們時一再說,指標就是陣列,陣列就是指標,這話直接用於理解一維陣列和指標,沒毛病,但高維,這倆不一樣,a不是int **a,而是(int *a)[20],指向陣列的指標,乙個指標本身可以看作陣列,這是第一維,指標指向陣列,指向的陣列中有20個int,比如,int *b,b指向int,b本身可以當int陣列來用,(b+1)指向的是下乙個int,相隔4位元組。同樣的方式理解a,(a+1)指向的是下乙個陣列,也就是下一行,與a相隔20個int,即80位元組。你寫下乙個*(a+1),得到的就是第二行的陣列。

指標指向的東西,是有大小的,比如int通常4位元組,a指向的是20個int,80個位元組,這個是在編譯時就必須確定的,原因是,如果你寫下乙個(a+1),編譯器得能算出來(a+1)到底指向哪個位址。這也就是為什麼,二維陣列在定義時,必須指定列數,而且列數必須是常量,行數隨便。就是編譯時編譯器就得知道a指向的東西有多大。

至於&(a+1)這種寫法,那純屬是寫錯了,這根本不是作者想說的所謂列指標,而是乙個(int **)[20]型別的,「指向int陣列的指標的指標」,想用它訪問到int值,前面得加三個*。

所以,還是那句話,少看這種爛書,會誤導你。看好書,把正確的概念理解透了,萬變不離其宗,見到這些奇怪的東西,也就心裡有數了。

3樓:太白斷水客

建議換本《c primer plus》中文版

行啊列啊都不重要,你只需要知道我們只是把資料放到記憶體裡的某個地方,然後在需要的時候用合適的辦法把它拿出來。

雖然本質上都一樣是把資料放到記憶體裡的某個位置,但是可以有不同的組織形式。就像都是把把學生安排到學校裡上課,但學校裡面有不同的年級和班級這些小單位。

用你熟悉的陣列來描述,就是陣列存放資料,二維陣列存放陣列,三維陣列存放二維陣列。

而我們取資料總是從大的單位到小的單位逐級尋找,就像把筆放在筆袋裡,筆袋放到書包裡,先開啟書包,然後開啟筆袋,最後才能取出筆。

具體說來,先假設有乙個陣列array

int array=;

要分別取出這個陣列裡面的三個值,也就是

array[x]

按這個形式中,讓x分別等於0,1,2就行了

二維陣列也類似,假設有乙個二維陣列Darray,要取出它這裡面的某個資料,就只需要用

Darray[x][y]

這個形式,讓x和y分別等於不同的值就行啦

當然,畢竟多了一級(形式上多了個方括號)二維陣列有一些一維陣列沒有的操作

譬如Darray[0]

這種形式似乎很迷。

但我們回到書包和筆袋的栗子,把Darray看做裝了很多個筆袋書包(假設書包的主人就喜歡幾支筆乙個筆袋,同時背了很多支筆),把書包裡的這些筆袋看成許多個一維陣列。

做了這兩個模擬,就很好理解這個操作啦,

Darray[x]

就是開啟書包,看到了很多筆袋

Darray[1]

代表編號為1的那個筆袋

Darray[1][y]

就是開啟這個筆袋,看到了很多一支筆

ok,然後我們取出這個筆袋裡那只編號為5的筆

Darray[1][5]

指標也是一樣,乙個指向陣列的指標,其實是存放著指向陣列的第乙個元素(也就是陣列的開始位置)的位址。

假設有乙個指標指向我們這個Darray

int **ptr=Darray

(多少個層(方括號),就有多少個*)

你應該知道指標取值是用*,書上可能把這個操作叫做「解引用」。

比如**ptr,就代表陣列的[0][0]位置上的值

也就是書包裡零號筆袋,編號為零的那支筆

當然啦,指標也可以和方括號搭配使用

*ptr[1]

這個操作取出陣列[1][0]位置上的那個值

也就是書包裡一號筆袋,編號為零的那支筆

看起來和Darray很相似對吧,對呀!

指標操作

*ptr[x]

就是取虛擬記憶體中位址為ptr+x那個位置的值

你看,不需要什麼行列叭。

4樓:蔣甬杭

這本書裡的「列指標」其實就是int指標。

至於題主圈出來的部分,錯誤百出。建議換本好一點的教材。

關於行指標和元素指標,我給個統一答案。

int型別:資料本身。

int*型別:指向資料的指標。

對於a,無論是什麼型別,

&a就是在a的型別上加個*,

*a就是在a的型別上去掉乙個*。

a加上或減去乙個整數,不影響a的型別,只會偏移若干元素。

a的型別就是a所指目標的型別再加上個*。

如何理解const char p表示的是指標所指的值不變,但指標可以變?

這個問題很好回答,也容易理解 const 就是固定一變數裡的值,這個簡單吧!const char p,char p是一指標,那const char p就是固定一指標的值了。const char p 的值實際是指向內在的乙個位址,那就是指向一片區域的起始位址。這個位置不能變了。僅此而已,當然這個區域的...

在c語言中,陣列和指標是等價的嗎?

ga6840 有些地方一樣,有些地方不一樣。所以不等價。讀內容的話 a 5 和 a 5 和 5 a 甚至和 5 a 都是等價的。有人認為陣列在編譯時自帶維度資訊,通過型別檢查可以幫助檢查越界。這一點比較勉強,畢竟 b 2 3 4 中的 b 其實也可以被稱作指標,也就是 b 3 4 在 C 語言裡,指...

尤拉函式的等價命題為什麼可以這麼表示

beanandbean 這道題的解法隱含了令全集 的假定。也就是說對於解中所考慮的集合 其補集 所表示的其實是 而非用全體自然數減去 得到的補集。注意到原解中定義 時所寫的不等式為小於 而非小於等於,不確定是否為筆誤,但是考慮到對於任意正整數 有 與 互素,因此 顯然不能整除 的素因子 所以定義 時...