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