我對C.目前正在研究陣列,我運行此代碼C如何確定數組的邊界?
#include <stdio.h>
signed char cData[][2][3] = {1,2,3,4,5,6};
int main()
{
printf("%d\n", cData[0][0]);
return 0;
}
答案是4210700
。
我想知道c如何確定第一個邊界? 我怎樣才能得到編號4210700
而不是1
?
我對C.目前正在研究陣列,我運行此代碼C如何確定數組的邊界?
#include <stdio.h>
signed char cData[][2][3] = {1,2,3,4,5,6};
int main()
{
printf("%d\n", cData[0][0]);
return 0;
}
答案是4210700
。
我想知道c如何確定第一個邊界? 我怎樣才能得到編號4210700
而不是1
?
cData[0][0]
基本上是一個指針(signed char *
類型),您需要%p
說明符。
printf("%p\n", (void *)cData[0][0]);
你忘了一對括號
printf("%d\n", cData[0][0][0]);
初始化如何工作的:第一個維度填充,然後第二和第三。取決於初始化的數量和牙套所需的最小確定
正常情況下,'括號'是指'大括號','{}',而不是方括號'[]'。我從來沒有聽說過方括號被稱爲括號。圓括號'()'也被稱爲圓括號,方括號有時被稱爲括號(而'<>'有時也被稱爲'尖括號')。 –
這個聲明
signed char cData[][2][3] = {1,2,3,4,5,6};
是聚集聲明。你可以把它改寫以下方式
typedef signed char T[2][3];
T cData[] = {1,2,3,4,5,6};
反過來類型T
是一種類型的骨料。其成員有類型signed char[3].
按照C標準(6.7.9初始化)
17每個大括號包圍的初始化列表具有相關聯的電流 對象。當不存在指定時,根據當前對象 對象的類型對當前 對象的子對象進行初始化:以下標順序遞增的數組元素,以聲明順序構造的 成員以及聯合的第一個已命名成員...
和
20如果聚集或聯合包含的元素或成員是 聚集或工會,這些規則遞歸適用於 subaggregates或含有編輯聯盟。如果 子集或包含的聯合的初始化程序以左大括號開始,則大括號及其匹配的右大括號 所包含的初始值設定項會初始化子集或包含聯合的 的元素或成員。 否則,只有來自列表 的足夠的初始化程序被用於說明子集團 的元素或成員或所包含工會的第一個成員;任何其餘的初始化程序 都將被初始化爲當前子集聚或包含的聯合是其一部分的集合 的下一個元素或成員。
因此,首先初始化signed char[3]
類型的最內層聚合體。然後初始化signed char[2][3]
類型的聚合的第二個成員。反過來,它是signed char [][2][3]
類型的聚合的成員。所以這個聚合的一個成員只有一個初始化器。
由於結果cDara
將有類型signed char[1][2][3]
。
表達式cData[0][0]
的類型signed char [3]
在函數調用中隱式轉換爲指向其第一個元素的指針。
所以在此聲明
printf("%d\n", cData[0][0]);
你想輸出的地址signed int
,一般是未定義行爲。
如果要輸出的第一個元素作爲一個整數,你應該寫
printf("%d\n", cData[0][0][0]);
如果數組是字符,那麼你爲什麼要告訴printf的把它解釋爲32位整數? –
它並不重要,因爲它將printf作爲整數平鋪。 –
也許你打算做'cData [0] [0] [0]'?否則,代碼沒有多大意義。 – Lundin