我想从{0,1,2,3}
开头跳到p,再到{4,5,6,7}
等。我该怎么做?
#include <stdio.h>
int main() {
char td[6][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
{12, 13, 14, 15},
{16, 17, 18, 19},
{20, 21, 22, 23}
};
char* p = *td;
printf("Address of td: \t%p, value=%u\n", td, (int)**td);
printf("Address of p: \t%p, value=%u\n", p, (int)*p);
p++;
/* How do I skip to the start of {4,5,6,7} (ie to be pointing at 4) ? */
printf("Address of p: \t%p, value=%u\n", p, (int)*p);
return 0;
}
答案 0 :(得分:1)
你应该先阅读this answer: Declaration-2
:我在哪里解释了char 2-D数组如何存储在内存中。
char*
p
指向td[0][0]
数组中的0
元素。如果您想增加p
,p
指向4
td[1][0]
,则按照cols数量增加p
= 4(数组是行= 6 * col = 4)。
p = p + 4;
检查this working代码。我应用了row-major的概念。
答案 1 :(得分:0)
为了跳到下一行,你需要一个指向包含四个元素的行的指针,而不是指向单个元素的指针。
因此,当你将p递增1时,指针看起来像char (*p)[4] = td
,它将指向下一行({4,5,6,7})
此外,您的字符指针初始化不正确,应为char *p = td
答案 2 :(得分:0)
td + 1也将跳过4个元素。 因为td指向第一个由4个元素组成的数组。它是一个指向数组的指针
printf("Address of p: \t%p, value=%u\n", *(td+1), **(td+1));
例如
char a[row][col];
for(i = 0 ; i < row*col ; i++)
printf("%c", *(*a+i) );
这将只用一个循环打印整个2d数组。