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

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

創(chuàng)建指向二維數(shù)組的指針。

創(chuàng)建指向二維數(shù)組的指針。

C
瀟湘沐 2019-07-04 13:39:01
創(chuàng)建指向二維數(shù)組的指針。我需要一個指向靜態(tài)二維數(shù)組的指針。這是怎么做的?static uint8_t l_matrix[10][20];void test(){    uint8_t **matrix_ptr = l_matrix; //wrong idea }我會犯各種各樣的錯誤,比如:警告:來自不兼容指針類型的賦值下標(biāo)值既不是數(shù)組也不是指針。錯誤:使用靈活數(shù)組成員無效
查看完整描述

3 回答

?
揚帆大魚

TA貢獻1799條經(jīng)驗 獲得超9個贊

充分明白嗎,你掌握以下概念:

數(shù)組不是指針!

首先(它已經(jīng)被傳得夠多了),數(shù)組不是指針..相反,在大多數(shù)使用中,它們會“衰變”到第一個元素的地址,而第一個元素可以分配給指針:

int a[] = {1, 2, 3};int *p = a; // p now points to a[0]

我假設(shè)它是這樣工作的,這樣就可以在不復(fù)制所有內(nèi)容的情況下訪問數(shù)組的內(nèi)容。這只是數(shù)組類型的行為,并不意味著它們是相同的。



多維陣列

多維數(shù)組只是以編譯器/機器能夠理解和操作的方式對內(nèi)存進行“分區(qū)”的一種方式。

例如,int a[4][3][5]=包含整數(shù)大小內(nèi)存的4*3*5(60)塊的數(shù)組。

與使用相比的優(yōu)勢int a[4][3][5]對平原int b[60]它們現(xiàn)在是“分區(qū)的”(如果需要的話,可以更容易地使用它們的“塊”),并且程序現(xiàn)在可以執(zhí)行綁定檢查。

事實上,int a[4][3][5]存儲一點兒沒錯喜歡int b[60]在記憶中-不同的是,程序現(xiàn)在管理它就好像它們是不同大小的實體(具體來說,是由三組五人組成的四組)。

記?。簝烧叨际?/trans>int a[4][3][5]int b[60]內(nèi)存是相同的,唯一的區(qū)別是應(yīng)用程序/編譯器是如何處理它們的。

{
  {1, 2, 3, 4, 5}
  {6, 7, 8, 9, 10}
  {11, 12, 13, 14, 15}}{
  {16, 17, 18, 19, 20}
  {21, 22, 23, 24, 25}
  {26, 27, 28, 29, 30}}{
  {31, 32, 33, 34, 35}
  {36, 37, 38, 39, 40}
  {41, 42, 43, 44, 45}}{
  {46, 47, 48, 49, 50}
  {51, 52, 53, 54, 55}
  {56, 57, 58, 59, 60}}

從這一點,您可以清楚地看到,每個“分區(qū)”只是一個數(shù)組,程序保持跟蹤。



句法

現(xiàn)在,數(shù)組在語法上不同于指針。..具體來說,這意味著編譯器/機器將以不同的方式對待它們。這看起來似乎是一個沒有頭腦的人,但看看這個:

int a[3][3];printf("%p %p", a, a[0]);

上面的示例兩次打印相同的內(nèi)存地址,如下所示:

0x7eb5a3b4 0x7eb5a3b4

但是,只有一個可以直接分配給指針。:

int *p1 = a[0]; // RIGHT !int *p2 = a; // WRONG !

為什么不能 a 分配給指針,但是 a[0] 能,會,可以?

簡單地說,這是多維數(shù)組的結(jié)果,我將解釋為什么:

在‘a我們?nèi)匀豢吹?,我們還有另一個“維度”值得期待。在‘a[0]然而,我們已經(jīng)進入了最高維,所以就程序而言,我們只是在看一個正常的數(shù)組。

你可能會問:

為什么數(shù)組在為數(shù)組創(chuàng)建指針方面是多維的?

最好這樣想:

多維數(shù)組的“衰變”不只是地址,而是帶有分區(qū)數(shù)據(jù)的地址(也就是它仍然理解它的底層數(shù)據(jù)是由其他數(shù)組組成的),它由第一個維度之外的數(shù)組設(shè)置的邊界組成。

這個“分區(qū)”邏輯不可能存在于指針中,除非我們指定它:

int a[4][5][95][8];int (*p)[5][95][8];p = a; // p = *a[0] // p = a+0

否則,數(shù)組的排序?qū)傩缘囊饬x就喪失了。

還請注意圓括號的用法。*pint (*p)[5][95][8]-也就是說,我們使用這些邊界來創(chuàng)建指針,而不是使用這些邊界的指針數(shù)組:int *p[5][95][8]



結(jié)語

讓我們回顧一下:

  • 如果數(shù)組在使用的上下文中沒有其他用途,則它們將衰減為地址。
  • 多維數(shù)組只是數(shù)組的數(shù)組,因此,“腐朽”地址將承擔(dān)“我有子維度”的負擔(dān)。
  • 維度數(shù)據(jù)不能存在于指針中

    除非你把它給它.

簡單地說:多維數(shù)組衰減到具有理解其內(nèi)容的能力的地址。


查看完整回答
反對 回復(fù) 2019-07-04
?
侃侃無極

TA貢獻2051條經(jīng)驗 獲得超10個贊

G‘day,

宣言

static uint8_t l_matrix[10][20];

為20個單元8_t位置的10行預(yù)留了存儲空間,即200 uint 8_t大小的位置,每個元素通過計算20 x行+列來查找。

所以

uint8_t (*matrix_ptr)[20] = l_matrix;

給您所需的,并指向數(shù)組第一行的列零元素?

編輯:再想一想,數(shù)組的名稱,顧名思義,不是一個指針嗎?也就是說,數(shù)組的名稱是第一個元素的位置的同義詞,即l_Matrix[0][0]?

編輯2:正如其他人所提到的,評論空間太小,不宜進一步討論。總之:

typedef uint8_t array_of_20_uint8_t[20];array_of_20_uint8_t *matrix_ptr = l_matrix;

不為所述數(shù)組提供任何存儲分配。

如上文所述,按照標(biāo)準的定義,聲明:

static uint8_t l_matrix[10][20];

預(yù)留了200個uint 8_t類型的順序位置。

引用使用表單語句的l_矩陣:

(*l_matrix + (20 * rowno) + colno)

將提供在行中找到的colno‘th元素的內(nèi)容。

所有指針操作都會自動考慮指向?qū)ο蟮拇笮 ?K&R第5.4節(jié),第103頁

如果在當(dāng)前對象的存儲中涉及到任何填充或字節(jié)對齊轉(zhuǎn)換,情況也是如此。編譯器將根據(jù)這些情況自動調(diào)整。根據(jù)C ANSI標(biāo)準的定義。

HTH

干杯,


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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