如何跳过多维数组中的行

时间:2013-08-24 16:48:27

标签: c pointers

我想从{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;
}

3 个答案:

答案 0 :(得分:1)

你应该先阅读this answer: Declaration-2:我在哪里解释了char 2-D数组如何存储在内存中。

char* p指向td[0][0]数组中的0元素。如果您想增加pp指向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数组。