1

我想从开头跳过 p {0,1,2,3},到{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;
}
4

3 回答 3

1

您应该首先阅读此答案::Declaration-2我在其中解释了 char 2-D 数组如何存储在内存中。

char* p指向td[0][0]数组中的元素0. 如果你想增加p这样的p4td[1][0]那么就增加pcols = 4 的数量(数组是 row = 6 * col = 4)。

p = p + 4;

检查此工作代码。我应用了row-major的概念。

于 2013-08-24T17:03:36.320 回答
0

为了跳到下一行,您需要一个指向包含四个元素的行的指针,而不是指向单个元素的指针。

因此,当您将 p 加 1 时,指针现在看起来char (*p)[4] = td会指向下一行 ({4,5,6,7})

另外,您对字符指针的初始化不正确,应该是char *p = td

于 2013-08-24T16:53:05.693 回答
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) );

这将只用一个循环打印整个二维数组。

于 2013-08-24T17:01:36.107 回答