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

C 我可以像打印字符串数组一样使用指针打印int数组数组吗?,c,arrays,pointers,C,Arrays,Pointers,如果要打印字符串数组,如: char juices_A[][12] = { "dragonfruit", "waterberry", "sharonfruit", }; 我可以简单地使用果汁A[0],果汁A[1],果汁A[3],分别作为字符串“龙果”,“水莓”,“莎伦果”,并打印出来 但如果我想打印int数组的数组,比如: int data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; 我不能简单地使用数据[0],数据[1],数据[2]

如果要打印字符串数组,如:

char juices_A[][12] = { "dragonfruit", "waterberry", "sharonfruit", };
我可以简单地使用
果汁A[0]
果汁A[1]
果汁A[3]
,分别作为字符串
“龙果”
“水莓”
“莎伦果”
,并打印出来

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

int data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
我不能简单地使用
数据[0]
数据[1]
数据[2]
作为指向
{1,2,3}
{4,5,6}
{7,8,9}
的指针,我需要采用一种更复杂的方式将它们打印出来。我需要在循环中使用循环。所以我想知道为什么我不能在int情况下使用指针?我在书中读到“数组变量像指针..”,所以我假设int数组变量
数据[0]、数据[1]、数据[2]
也像指针

#include <stdio.h>

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;
}

字符串:

-------------------------
|h | e | l | l | o | \0 |
-------------------------
|w | o | r | l | d | \0 |
------------------------
----------------
|1 | 2 | 3 | 4 |
----------------
|5 | 6 | 7 | 8 |
----------------
正如您所看到的,这个数组可以存储在2D字符数组中

char a[2][6];
现在,
a[i]
给出了每一行的起始地址,
%s
打印出一个字符串,直到
\0
被卸载,这样您就可以传递每一行的地址并获取该行的内容。就像

char *p = "hello";
printf("%s\n",p);
注意: 同样,如果要在特定位置读取字符,需要指定
a[row][col]

鉴于

整数:

-------------------------
|h | e | l | l | o | \0 |
-------------------------
|w | o | r | l | d | \0 |
------------------------
----------------
|1 | 2 | 3 | 4 |
----------------
|5 | 6 | 7 | 8 |
----------------
现在您可以使用如下数组

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

区别在于,有效C字符串的sentinel条件是
\0
,用于访问每一行,而不是整数

所以我假设int数组变量data[0]、data[1]、data[2]也是 指针


是的,它们是指向每一行的指针,但您需要取消对指针的引用以获得正确的值?因此,如果
data[0]
是一个指针,那么执行
data[0][column]
char juice_a[]12]={“龙果”、“水莓”、“莎伦果”}每当访问数据时,它都会打印,直到到达
\0
,因为字符串只在
\0
之前被考虑。因此,当我们使用
juice\u A[0]
时,它指向第一个数据的开始,直到到达
\0
为止。但是要获得单个字符,我们需要提到数组的两个维度

char-juice\u A[1][2]
访问
waterberry中的
't'

int
的情况并非如此,因为每个都被视为单独的实体。所以我们使用数组的两个维度来访问它

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

龙;水蜜桃;莎伦水果

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

1,2,0,…`
这就不同了

您可以像指针一样使用访问数组,反之亦然

下面是程序的输出:

dragonfruit;waterberry;sharonfruit;
{ { 1, 2, 3, }, { 4, 5, 6, }, { 7, 8, 9, }, }
下面是对代码的修改:

#include <stdio.h>
#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;
}
#包括
#定义行宽度3
#定义表3的高度
内部主(空){
char*果汁[]={“龙果”、“水莓”、“莎伦果”};
int数据[表格高度][行宽度]={{1,2,3},{4,5,6},{7,8,9};
对于(int n=0;n
#包括
int main()
{
int data[3][3]={{1,2,3},{4,5,6},{7,8,9};
int*ptr;
整数行=3;
int列=3;
int i;
ptr=&数据[0][0];
while(行-->0){
i=列;
而(i-->0){
printf(“%d”,*ptr);
ptr+=1;
}
putchar('\n');
}
返回0;
}
或:

#包括
int main()
{
int data[3][3]={{1,2,3},{4,5,6},{7,8,9};
int*ptr;
整数行=3;
int列=3;
int max=行*列;
ptr=&数据[0][0];
同时(最大-->0){
printf(“%d”,*ptr);
ptr++;
如果(最大%columns==0)
putchar('\n');
}
返回0;
}

该语言将
char*
视为一个字符串——一个具有终止空字符的字符数组。对于
int
int*
没有类似的内容
char
char*
在这方面很特别。您似乎非常清楚地理解了事情,并且参考上面的评论,简单的答案是“否”。顺便说一句,您的示例指的是
juice\u A[0]
当您的数组被调用时,
会榨汁。\u A
。使用指针表示法的问题是您失去了[]表示法为您保留的边界感。因此,在本例中,我们只是将数据视为具有指针的整数的一维数组,然后使用基本矩阵数学将其表示为一个hxw表。C知道,因为它是一个指向需要移动的整数数组的指针,所以每增加一个“外部”增量1,就使用内部指针偏移量4字节。@Allaboutthatbase2,
在本例中,我们只是将数据视为一个整数的一维数组,我们有一个指向它的指针。
实际上它可以工作,但它是未定义的行为,看一看,谢谢。第二个答案更容易理解,因为现在是我睡觉的时间。我把铸造数据当作一个**来玩弄,但为时已晚,我没有进一步研究。我不知道优化编译器的警告。我真的很惊讶如果你不
#include <stdio.h>

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;
}