这是处理C多维数组导航的正确方法吗

这是处理C多维数组导航的正确方法吗,c,pointers,C,Pointers,我担心的是,我计算td终点的方法是正确的。这是最优的吗?有更好的C习惯用法来做这类事情吗 #include <stdio.h> int main() { char td[][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; int rows = s

我担心的是,我计算td终点的方法是正确的。这是最优的吗?有更好的C习惯用法来做这类事情吗

#include <stdio.h>

int main() {

    char td[][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;  

    int rows = sizeof(td) / sizeof(td[0]);
    int cols = sizeof(td[0]) / sizeof(td[0][0]);

    char* end = p + (rows * cols);

    /* Print first element in each 'row' */
    while(p != end) {
        printf("first element: %u\n", p[0]);
        p += 4;
    }
    return 0;
}
#包括
int main(){
char td[][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;
int rows=sizeof(td)/sizeof(td[0]);
int cols=sizeof(td[0])/sizeof(td[0][0]);
char*end=p+(行*cols);
/*打印每个“行”中的第一个元素*/
while(p!=结束){
printf(“第一个元素:%u\n”,p[0]);
p+=4;
}
返回0;
}

人们通常会在C中使用for循环

int main() {
    char td[][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}  };

    int rows = sizeof(td) / sizeof(td[0]);
    int cols = sizeof(td[0]) / sizeof(td[0][0]);

    /* Print first element in each 'row' */
    for (int row = 0; row < rows; row++)
        printf("first element: %u\n", td[row][0]);

    return 0;
}
intmain(){
char td[][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}  };
int rows=sizeof(td)/sizeof(td[0]);
int cols=sizeof(td[0])/sizeof(td[0][0]);
/*打印每个“行”中的第一个元素*/
对于(int row=0;row

但是,您编写的代码确实有效。

在C中通常使用for循环

int main() {
    char td[][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}  };

    int rows = sizeof(td) / sizeof(td[0]);
    int cols = sizeof(td[0]) / sizeof(td[0][0]);

    /* Print first element in each 'row' */
    for (int row = 0; row < rows; row++)
        printf("first element: %u\n", td[row][0]);

    return 0;
}
#define COLS 4
int main() {
    char td[][COLS] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11}, 
                      {12,13,14,15}, {16,17,18,19}, {20,21,22,23}  };

    int rows = sizeof(td) / sizeof(td[0]);

    /* print the matrix */
    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < COLS; col++) {
            printf("first element: %u\n", td[row][col]);
        }
    }
    return 0;
}
intmain(){
char td[][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}  };
int rows=sizeof(td)/sizeof(td[0]);
int cols=sizeof(td[0])/sizeof(td[0][0]);
/*打印每个“行”中的第一个元素*/
对于(int row=0;row
但是,您编写的代码确实有效。

\code>#定义COLS 4
#define COLS 4
int main() {
    char td[][COLS] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11}, 
                      {12,13,14,15}, {16,17,18,19}, {20,21,22,23}  };

    int rows = sizeof(td) / sizeof(td[0]);

    /* print the matrix */
    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < COLS; col++) {
            printf("first element: %u\n", td[row][col]);
        }
    }
    return 0;
}
int main(){ char td[][COLS]={0,1,2,3},{4,5,6,7},{8,9,10,11}, {12,13,14,15}, {16,17,18,19}, {20,21,22,23} }; int rows=sizeof(td)/sizeof(td[0]); /*打印矩阵*/ 对于(int row=0;row 对于每行的第一列:

    for (int row = 0; row < rows; row++) {
        printf("first element: %u\n", td[row][0]);
    }
for(int row=0;row
#定义COLS 4
int main(){
char td[][COLS]={0,1,2,3},{4,5,6,7},{8,9,10,11},
{12,13,14,15}, {16,17,18,19}, {20,21,22,23}  };
int rows=sizeof(td)/sizeof(td[0]);
/*打印矩阵*/
对于(int row=0;row
对于每行的第一列:

    for (int row = 0; row < rows; row++) {
        printf("first element: %u\n", td[row][0]);
    }
for(int row=0;row
正确的方式意味着什么?这是一种方法,但并不简单,出现错误的可能性更大。(这可能是正确的,但并不可取)这就是你所有其他帖子背后的原因吗?只需通过td[0][0]、td[1][0]等引用您的数据,这样做没有问题。计算td[1]所需的时间比将p增加4所需的时间要少。这当然是一种方法,但却是一种更为迟钝的方法。在索引上使用双
for
循环将更清晰、更简洁、更不容易出错。您关注的是性能吗?因为有很多方法可以做到这一点。请注意,如果您关心速度/效率,指针
p[]
td[]][]
都同样好,但是
td[][]
非常简单。正确的方法是什么?这是一种方法,但并不简单,出现错误的可能性更大。(这可能是正确的,但并不可取)这就是你所有其他帖子背后的原因吗?只需通过td[0][0]、td[1][0]等引用您的数据,这样做没有问题。计算td[1]所需的时间比将p增加4所需的时间要少。这当然是一种方法,但却是一种更为迟钝的方法。在索引上使用双
for
循环将更清晰、更简洁、更不容易出错。您关注的是性能吗?因为有很多方法可以做到这一点。请注意,如果你关心速度/效率,指针
p[]
td[]][]
都同样好,但是
td[][]
非常简单。不再需要
p+=4
了。我明白你的意思是:清晰。有了Mbrach的COL定义,下面是的,这可能更好看。不再需要
p+=4
。我明白你的意思了:清晰。使用MBRACH的COLS define DOWN是的,这看起来可能更好。为什么要在列中循环打印每行的第一个元素<代码>printf(“第一个元素:%u\n”,td[row][0])就足够了。@VarunLakkur很抱歉,我在打印每一列时都做了说明。我将添加这种情况。为什么要循环遍历列以打印每行的第一个元素<代码>printf(“第一个元素:%u\n”,td[row][0])就足够了。@VarunLakkur很抱歉,我在打印每一列时都做了说明。我要补充一点。