从第269页的C Programming: A Modern Approach, 2nd Edition这本书开始,这ç§è¯´æ³•æœ‰æ„义å—
 Âå°±åƒä¸€ç»´æ•°ç»„çš„å称å¯ä»¥ç”¨ä½œæŒ‡é’ˆä¸€æ ·ï¼Œ any 数组的å称也å¯ä»¥ç”¨ä½œæŒ‡é’ˆï¼Œè€Œä¸ç®¡å®ƒæœ‰å¤šå°‘维。但是,需è¦å°å¿ƒã€‚考虑以下数组:
   Âsource ./Scripts/activate
int a[NUM_ROWS][NUM_COLS];
ä¸æ˜¯æŒ‡å‘a
的指针,而是指å‘a[0][0];
的指针。 如果从C的角度æ¥çœ‹å®ƒï¼Œè¿™å°†æ›´æœ‰æ„ä¹‰ï¼Œå› ä¸ºCå°†a[0]
视为ä¸æ˜¯äºŒç»´æ•°ç»„,而是将其视为一维数组的一维数组。当用作指针时,a
的类型为a
(指å‘长度为int (*) [NUM_COLS]
的整数数组的指针)。
æˆ‘å¾ˆå›°æƒ‘ï¼Œå› ä¸ºå½“æˆ‘æƒ³åˆ°â€œå…¶å…ƒç´ æ˜¯ä¸€ç»´æ•°ç»„çš„æ•°ç»„â€ æ—¶ï¼Œæˆ‘è®¤ä¸ºæ˜¯jagged-array,但这ä¸æ˜¯è¿™é‡Œè¦å‘生的事情。有指针算术的å®ï¼Ÿ
这是关于类型系统的å‚考,以åŠå®ƒå¦‚何处ç†å¤šç»´æ•°ç»„?有人å¯ä»¥è§£é‡Šå—?
ç”案 0 :(得分:7)
是的,这是有é“ç†çš„,ä¸æ˜¯ï¼Œå®ƒç”šè‡³ä¸æ˜¯åœ¨è°ˆè®ºâ€œå‚å·®ä¸é½â€æˆ–“å‚å·®ä¸é½â€çš„数组。åªæ˜¯å½“我们说
int a[NUM_ROWS][NUM_COLS];
我们æ£åœ¨åˆ›å»ºçš„是一个数组a
,而它是一个数组...其他数组。您å¯ä»¥è¿™æ ·æƒ³ï¼š
+---------------------------------------+
| +--------+--------+--------+--------+ |
a: [0]: | | | | | | |
| +--------+--------+--------+--------+ |
+ +
| +--------+--------+--------+--------+ |
[1]: | | | | | | |
| +--------+--------+--------+--------+ |
+ +
| +--------+--------+--------+--------+ |
[2]: | | | | | | |
| +--------+--------+--------+--------+ |
+---------------------------------------+
(这里NUM_COLS
显然是4,而NUM_ROWS
是3。)
二维(或更多)二维数组与简å•çš„å•ç»´æ•°ç»„100%相似-您åªéœ€è¦ä»”细考虑这些相似之处å³å¯ã€‚如果a
是一个数组,则在需è¦å…¶å€¼çš„表达å¼ä¸å¯¹a
的任何æåŠéƒ½ä¼šå¯¼è‡´æŒ‡å‘æ•°ç»„ç¬¬ä¸€ä¸ªå…ƒç´ &a[0]
çš„æŒ‡é’ˆã€‚å› æ¤ï¼Œè€ƒè™‘到我们è¦è®¨è®ºçš„二维数组a
,a
的值是&a[0]
,它是指å‘NUM_COLS
整数数组的指针< / em>。
å¦‚æžœå¤šç»´æ•°ç»„ä¸‹æ ‡è¦æ£å¸¸å·¥ä½œï¼Œåˆ™å¿…须以这ç§æ–¹å¼å·¥ä½œã€‚如果我们写a[i][j]
,则解释为(a[i])[j]
。åƒå¾€å¸¸ä¸€æ ·ï¼Œa
å˜æˆäº†æŒ‡å‘æ•°ç»„ç¬¬ä¸€ä¸ªå…ƒç´ çš„æŒ‡é’ˆï¼Œä½†æ˜¯a[i]
ç‰æ•ˆäºŽ*(a + i)
,其ä¸æŒ‡é’ˆç®—术最终被指å‘çš„å…ƒç´ çš„å¤§å°ç¼©æ”¾-也就是说,它更åƒ*(a+ i * sizeof(*a))
ã€‚å› æ¤sizeof(*a)
必须是sizeof(int [NUM_COLS])
或NUM_COLS * sizeof(int)
ã€‚è¿™æ ·ï¼Œa[i]
将使您获得第i
个å数组,然åŽj
å¯ä»¥é€‰æ‹©å数组ä¸çš„一个å•å…ƒï¼ˆå¤§å°ä¸ºint
)。 / p>
最åŽä¸€ç‚¹ï¼šæˆ‘曾å£å¤´è°ˆè®ºè¿‡â€œå¤šç»´æ•°ç»„â€ï¼Œä½†ä¸¥æ ¼æ¥è¯´ï¼Œæ£å¦‚è¿™é‡Œçš„è®¸å¤šå¸¸å®¢æ‰€æŒ‡å‡ºçš„é‚£æ ·ï¼ŒC没有多维数组。它åªæœ‰ä¸€ç»´æ•°ç»„,æ£å¦‚我们在æ¤å¤„çœ‹åˆ°çš„é‚£æ ·ï¼Œæˆ‘ä»¬å®žé™…ä¸Šè®¤ä¸ºçš„äºŒç»´æ•°ç»„æ˜¯ä¸€ç»´æ•°ç»„ï¼Œå…¶å…ƒç´ æ°å¥½æ˜¯å…¶ä»–一维数组。 (如果C具有真æ£çš„å¤šç»´æ•°ç»„ï¼Œåˆ™ä¸‹æ ‡å¯èƒ½çœ‹èµ·æ¥åƒa[i,j]
而ä¸æ˜¯a[i][j]
。)
附录:尽管您æ到了指针算术,而我也æ到了指针算术,但é‡è¦çš„是è¦è®¤è¯†åˆ° a
的定义ä¸æ²¡æœ‰æŒ‡é’ˆã€‚仅当我们å°è¯•â€œèŽ·å–†a
的值或解释a[i]
与*(a + i)
ç‰æ•ˆæ—¶ï¼ŒæŒ‡é’ˆæ‰ä¼šå‡ºçŽ°ã€‚
对于确实包å«æŒ‡é’ˆçš„æ•°æ®ç»“构,我们å¯ä»¥å¯¹æ¯”代ç æ述的情况
int *a2[NUM_ROWS];
for(i = 0; i < NUM_ROWS; i++)
a2[i] = malloc(NUM_COLS * sizeof(int));
这为我们æ供了éžå¸¸ä¸åŒçš„内å˜å¸ƒå±€ï¼š
+-----+
a2: | | +--------+--------+--------+--------+
| *------->| | | | |
| | +--------+--------+--------+--------+
+-----+
| | +--------+--------+--------+--------+
| *------->| | | | |
| | +--------+--------+--------+--------+
+-----+
| | +--------+--------+--------+--------+
| *------->| | | | |
| | +--------+--------+--------+--------+
+-----+
这就是通常所说的“å‚å·®ä¸é½â€æˆ–“å‚å·®ä¸é½â€çš„æ•°ç»„ï¼Œå› ä¸ºåœ¨è¿™ç§æƒ…况下,所有行的长度都ä¸å¿…相åŒã€‚ä½†æ˜¯ï¼Œå‡ ä¹Žå¯ä»¥é”术地使用“ a2[i][j]
â€è¡¨ç¤ºæ³•è®¿é—®â€œå‚å·®ä¸é½â€æ•°ç»„ä¸çš„å•å…ƒæ ¼ã€‚为了获得完全的活力,我们å¯ä»¥ä½¿ç”¨
int **a3 = malloc(NUM_ROWS * sizeof(int *));
for(i = 0; i < NUM_ROWS; i++)
a3[i] = malloc(NUM_COLS * sizeof(int));
导致æ¤å†…å˜å¸ƒå±€ï¼š
+-----+
a3: | |
| * |
| | |
+--|--+
|
|
V
+-----+
| | +--------+--------+--------+--------+
| *------->| | | | |
| | +--------+--------+--------+--------+
+-----+
| | +--------+--------+--------+--------+
| *------->| | | | |
| | +--------+--------+--------+--------+
+-----+
| | +--------+--------+--------+--------+
| *------->| | | | |
| | +--------+--------+--------+--------+
+-----+
a3[i][j]
也å¯ä»¥åœ¨è¿™é‡Œå·¥ä½œã€‚
(当然,在构建诸如a2
å’Œa3
之类的“动æ€æ•°ç»„â€çš„真实代ç ä¸ï¼Œæˆ‘们必须检查以确ä¿malloc
ä¸ä¼šè¿”回{{1 }}。
ç”案 1 :(得分:3)
å¦ä¸€ç§æŸ¥çœ‹æ–¹å¼...
对于任何类型的T
,我们创建一个数组为
T arr[N];
å…¶ä¸T
å¯ä»¥æ˜¯int
,char
,double
,struct foo
ï¼Œæ— è®ºæ˜¯ä»€ä¹ˆï¼Œéƒ½è¯»ä¸ºâ€œ {{1}çš„Nå…ƒç´ æ•°ç»„}â€ã€‚也å¯ä»¥æ˜¯å¦ä¸€ç§æ•°ç»„ç±»åž‹ã€‚å› æ¤ï¼Œå‡è®¾T
ä¸ä»…仅是int
çš„ Må…ƒç´ æ•°ç»„ï¼Œæˆ‘ä»¬å°†å…¶å†™ä¸º
T
这表示为“ int
是int arr[N][M];
çš„Må…ƒç´ æ•°ç»„çš„Nå…ƒç´ æ•°ç»„â€ã€‚è¿™ä¸æ˜¯é”¯é½¿çŠ¶çš„阵列-所有“行â€çš„大å°å‡ç›¸åŒã€‚但这也ä¸å®Œå…¨æ˜¯äºŒç»´æ•°ç»„-它是数组的数组。表达å¼arr
具有数组类型(int
)。
æ¤è§†å›¾è¿˜å¸®åŠ©æˆ‘们找出指å‘数组类型的指针。除éžå®ƒæ˜¯arr[i]
或一元int [M]
è¿ç®—符的æ“作数,或者是用于在声明ä¸åˆå§‹åŒ–å—符数组的å—符串文å—,å¦åˆ™ç±»åž‹ä¸ºâ€œ Nâ€çš„ expression sizeof
â€ï¼ˆ&
)的-element数组将被转æ¢ï¼ˆâ€œè¡°å‡â€ï¼‰ä¸ºâ€œæŒ‡å‘T
的指针(T [N]
)类型的表达å¼ã€‚åŒæ ·ï¼Œå¦‚果将T
替æ¢ä¸ºæ•°ç»„类型T *
,则表达å¼ä¸ºâ€œ T
çš„Må…ƒç´ æ•°ç»„çš„Nå…ƒç´ æ•°ç»„â€ï¼ˆint [M]
),它会“衰å‡â€ä»¥é”®å…¥â€œ int
çš„Må…ƒç´ æ•°ç»„çš„æŒ‡é’ˆâ€ï¼ˆint [N][M]
)。