第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么需要使用type **指向type *?

為什么需要使用type **指向type *?

C
智慧大石 2019-10-30 14:43:06
我已經(jīng)讀了幾天《學(xué)習(xí)C的艱難方法》,但這是我要真正理解的東西。作者Zed寫道這char **是為了“指向(指向char的指針)的指針”,并說這是必需的,因?yàn)槲艺噲D指向二維的東西。這是網(wǎng)頁上的確切內(nèi)容一個char *已經(jīng)是“指向char的指針”,因此這只是一個字符串。但是,您需要2個級別,因?yàn)槊Q是二維的,這意味著您需要char **作為“指向(指向char的指針)”類型的指針。這是否意味著我必須使用一個可以指向二維事物的變量,這就是為什么我需要二維變量的原因**?只需稍作跟蹤,這是否也適用于n維?這是相關(guān)的代碼char *names[] = { "Alan", "Frank", "Mary", "John", "Lisa" };char **cur_name = names;
查看完整描述

3 回答

?
喵喔喔

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個贊

不,該教程的質(zhì)量值得懷疑。我不建議繼續(xù)閱讀它。


A char**是指針到指針。它不是二維數(shù)組。它不是指向數(shù)組的指針。它不是指向2D數(shù)組的指針。


本教程的作者可能會感到困惑,因?yàn)榇嬖趶V泛的錯誤和錯誤做法,說您應(yīng)該分配動態(tài)2D數(shù)組,如下所示:


// BAD! Do not do like this!

int** heap_fiasco;

heap_fiasco = malloc(X * sizeof(int*));

for(int x=0; x<X; x++)

{

  heap_fiasco[x] = malloc(Y * sizeof(int));

}

但是,這不是2D數(shù)組,它是一個緩慢的,碎片化的查找表,分配給整個堆。訪問查找表中一項(xiàng)的語法heap_fiasco[x][y]類似于數(shù)組索引語法,因此許多人出于某種原因認(rèn)為這是分配2D數(shù)組的方式。


動態(tài)分配2D數(shù)組的正確方法是:


// correct

int (*array2d)[Y] = malloc(sizeof(int[X][Y]));

您可以說第一個不是數(shù)組,因?yàn)槿绻@樣做memcpy(heap_fiasco, heap_fiasco2, sizeof(int[X][Y])),代碼將崩潰并燃燒。這些項(xiàng)目未分配在相鄰的存儲器中。


同樣memcpy(heap_fiasco, heap_fiasco2, sizeof(*heap_fiasco))也會崩潰和燒毀,但是由于其他原因:您得到的是指針的大小而不是數(shù)組的大小。


雖然memcpy(array2d, array2d_2, sizeof(*array2d))會起作用,因?yàn)樗?D數(shù)組。


查看完整回答
反對 回復(fù) 2019-10-30
?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個贊

指針花了我一段時間來理解。我強(qiáng)烈建議繪制圖表。


請閱讀并理解C ++教程的這一部分(至少在指針方面,圖表確實(shí)對我有所幫助)。


告訴您對于二維數(shù)組,您需要一個指向char的指針是一個謊言。您不需要它,但這是實(shí)現(xiàn)它的一種方法。


內(nèi)存是順序的。如果您想像單詞hello那樣連續(xù)放置5個字符(字母),則可以定義5個變量,并始終記住使用它們的順序,但是如果要保存6個字母的單詞會怎樣呢?您是否定義更多變量?如果只按順序?qū)⑺鼈兇鎯υ趦?nèi)存中會不會更容易?


因此,您要做的就是向操作系統(tǒng)請求5個字符(每個字符恰好是一個字節(jié)),然后系統(tǒng)將向您返回一個內(nèi)存地址,該地址開始您的5個字符的序列。您使用此地址并將其存儲在變量中,我們將其稱為指針,因?yàn)樗赶蚰膬?nèi)存。


指針的問題在于它們只是地址。您怎么知道該地址存儲了什么?是5個字符還是8個字節(jié)的大二進(jìn)制數(shù)字?還是它是您加載的文件的一部分?你怎么知道的?


這是像C這樣的編程語言試圖通過提供類型來幫助您的地方。類型告訴您變量存儲的內(nèi)容,而指針也具有類型,但是其類型告訴您指針指向的內(nèi)容。因此,char *是指向存儲位置的指針,該存儲位置包含單個char或一系列chars??杀痗har的是,您需要記住自己有關(guān)多少個數(shù)字的部分。通常,您將這些信息存儲在一個變量中,以提醒您有多少個字符。


那么,當(dāng)您想要擁有二維數(shù)據(jù)結(jié)構(gòu)時,該如何表示呢?


最好用一個例子來解釋。讓我們做一個矩陣:


1  2  3  4

5  6  7  8

9 10 11 12

它具有4列和3行。我們?nèi)绾未鎯λ?/p>


好吧,我們可以制作3個序列,每個序列有4個數(shù)字。第一個序列為1  2  3  4,第二個序列為,5  6  7  8第三個和最后一個序列為9 10 11 12。因此,如果我們要存儲4個數(shù)字,我們將要求系統(tǒng)為我們保留4個數(shù)字并為它們提供一個指針。這些將是指向數(shù)字的指針。但是,由于我們需要3個指針,因此我們將要求系統(tǒng)給3個指針指向指針編號。


這就是您最終得到建議的解決方案的方式...


另一種方法是認(rèn)識到您需要4乘3的數(shù)字,然后要求系統(tǒng)按順序存儲12個數(shù)字。但是,您如何訪問第2行和第3列中的數(shù)字?這是數(shù)學(xué)的用武之地,但讓我們在示例中進(jìn)行嘗試:


1  2  3  4

5  6  7  8

9 10 11 12

如果我們將它們彼此相鄰存儲,它們將如下所示:


offset from start:  0  1  2  3    4  5  6  7    8   9  10  11   

numbers in memory: [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]

所以我們的映射是這樣的:


row | column | offset | value

 1  |   1    |   0    |   1

 1  |   2    |   1    |   2

 1  |   3    |   2    |   3

 1  |   4    |   3    |   4

 2  |   1    |   4    |   5

 2  |   2    |   5    |   6

 2  |   3    |   6    |   7

 2  |   4    |   7    |   8

 3  |   1    |   8    |   9

 3  |   2    |   9    |  10

 3  |   3    |  10    |  11

 3  |   4    |  11    |  12

現(xiàn)在,我們需要制定一個簡單易行的公式,將行和列轉(zhuǎn)換為偏移量……如果我有更多時間,我會回到它的位置上……現(xiàn)在我需要回家(抱歉)。 ..


編輯:我有點(diǎn)晚了,但讓我繼續(xù)。要查找行和列中每個數(shù)字的偏移量,可以使用以下公式:


offset = (row - 1) * 4 + (column - 1)

如果您注意到-1這里的兩個數(shù)字,您會發(fā)現(xiàn)這是因?yàn)槲覀兊男刑柡土刑栆?開頭,所以我們必須這樣做,這就是計(jì)算機(jī)科學(xué)家偏愛基于零的偏移量的原因(由于該公式) )。但是,對于C語言中的指針,當(dāng)您使用多維數(shù)組時,語言本身會為您應(yīng)用此公式。因此,這是另一種方式。


查看完整回答
反對 回復(fù) 2019-10-30
?
翻過高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個贊

從您的問題中,我了解的是您在問為什么要為聲明為* names []的變量使用char **。因此,答案是當(dāng)您只寫names []時,它就是array的語法,而array本質(zhì)上是一個指針。


因此,當(dāng)您編寫* names []時,這意味著您要指向一個數(shù)組。而且因?yàn)閿?shù)組基本上是一個指針,所以這意味著您有一個指向指針的指針,這就是為什么如果您編寫的話編譯器不會抱怨的原因


char ** cur_name =名稱;


在上面的代碼行中,您聲明了一個指向字符指針的指針,然后使用指向數(shù)組的指針初始化它(記住數(shù)組也是指針)。


查看完整回答
反對 回復(fù) 2019-10-30
  • 3 回答
  • 0 關(guān)注
  • 490 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號