我可以使用指针打印出int数组的数组,就像字符串数组一样吗?

如果我想打印出如下字符串数组:

char juices_A[][12] = { "dragonfruit", "waterberry", "sharonfruit", }; 

我可以简单地分别使用juices_A[0]juices_A[1]juices_A[3]作为指向字符串"dragonfruit""waterberry""sharonfruit"的指针,然后打印出来。

但是,如果我想打印出int数组的数组,如果:

 int data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; 

我不能简单地使用data[0]data[1]data[2]作为指向{ 1, 2, 3 }{ 4, 5, 6 }{ 7, 8, 9 } { 4, 5, 6 }指针,我需要采用打印出来的更复杂的方法。 我需要使用循环内部循环。 所以我想知道为什么我不能在int情况下使用指针? 我在书上读到“ 数组变量就像指针…… ”所以我假设int数组变量data[0],data[1],data[2]也像指针……

 #include  int main() { int i_A = 0; char juices_A[][12] = { "dragonfruit", "waterberry", "sharonfruit", }; for (; i_A < 3; i_A++) printf("%s;", juices_A[i_A]); puts(""); int i_B = 0; int data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; for (; i_B < 3; i_B++) { int i_C = 0; for (; i_C < 3; i_C++) printf("%i,", data[i_B][i_C]); printf(";"); } return 0; } 

结果是:

 dragonfruit;waterberry;sharonfruit; 1,2,3,;4,5,6,;7,8,9,; 

您可以使用指针等访问数组,反之亦然。

这是以下程序的输出:

 dragonfruit;waterberry;sharonfruit; { { 1, 2, 3, }, { 4, 5, 6, }, { 7, 8, 9, }, } 

这是对代码的修改:

 #include  #define ROW_WIDTH 3 #define TABLE_HEIGHT 3 int main(void) { char *juices[] = { "dragonfruit", "waterberry", "sharonfruit", }; int data[TABLE_HEIGHT][ROW_WIDTH] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; for (int n = 0; n < ROW_WIDTH; n++) printf("%s;", juices[n]); int *ip = (int *)data; printf("\n{ "); for (int i = 0; i < TABLE_HEIGHT; i++) { printf("{ "); for(int j = 0; j < ROW_WIDTH; j++) { printf("%d, ", *ip + ((i * ROW_WIDTH) + j)); } printf("}, "); } printf("}\n"); return 0; } 

字符串:

 ------------------------- |h | e | l | l | o | \0 | ------------------------- |w | o | r | l | d | \0 | ------------------------ 

如您所见,此数组可以存储在2D char数组中

 char a[2][6]; 

现在a[i]给出每行的起始地址, %s打印出一个字符串,直到一个\0被告知,所以你可以只传递每一行的地址并获取该行的内容。 就像

 char *p = "hello"; printf("%s\n",p); 

注意:如果您想要读取特定位置的字符,则需要指定a[row][col]

整数:

 ---------------- |1 | 2 | 3 | 4 | ---------------- |5 | 6 | 7 | 8 | ---------------- 

现在你可以有一个像这样的数组

 int b[2][4]; 

b[i]将为您提供每行的起始地址,但为了获取存储在特定位置的值,您需要使用b[row][col]指定值。

不同之处在于有效C字符串的前哨条件是\0 ,并且它用于访问每一行,而不是整数的情况。

所以我假设int数组变量data [0],data [1],data [2]也像指针一样

是的,它们是指向每一行的指针,但您需要取消引用指针才能获得正确的值? 因此,如果data[0]是一个指针,则执行data[0][column]

char juices_A[][12] = { "dragonfruit", "waterberry", "sharonfruit" }; 无论何时访问数据,它都会打印,直到达到\0 ,因为只考虑字符串直到\0 。 因此,当我们使用juices_A[0]它指向第一个数据的开始,直到达到\0为了得到一个单独的char,我们需要提到数组的维度。

char juices_A[1][2]访问waterberry 't'

但是这不是int的情况,因为每个都被认为是独立的实体。 所以我们使用数组的两个维来访问它。

即使我们减少数组的大小,如char juices_A[][12] = { "dragon", "waterberry", "sharonfruit" }; 打印时输出

dragon;waterberry;sharonfruit

但在int data[3][3] = { { 1, 2}, { 4, 5, 6 }, { 7, 8, 9 } };的情况下int data[3][3] = { { 1, 2}, { 4, 5, 6 }, { 7, 8, 9 } }; 它输出

1,2,0,….这就有所不同

 #include  int main() { int data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int *ptr; int lines = 3; int columns = 3; int i; ptr = &data[0][0]; while (lines-- > 0) { i = columns; while (i-- > 0) { printf("%d ", *ptr); ptr += 1; } putchar('\n'); } return 0; } 

要么:

 #include  int main() { int data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int *ptr; int lines = 3; int columns = 3; int max = lines * columns; ptr = &data[0][0]; while (max-- > 0) { printf("%d ", *ptr); ptr++; if (max % columns == 0) putchar('\n'); } return 0; }