我可以使用指针打印出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; }