C中引用2D数组到函数和逗号分隔语句的其他最佳或更好的方法

C中引用2D数组到函数和逗号分隔语句的其他最佳或更好的方法,c,pointers,multidimensional-array,C,Pointers,Multidimensional Array,这是我找到的一种通过地址进行引用的方法,我知道还有很多其他方法,有人能列出其他方法吗?如何有效地进行2D引用??我的代码有点破旧,所以有人能建议其他方法吗?逗号分隔的语句在第二个while循环中是如何工作的???编译器如何处理这些语句有任何特殊情况 有人能列出其他方法来有效地进行二维参照吗 最简单的方法是用更传统的s[i][j]替换指针算术**s+i+j中的练习: 这种选择的一个结果是行大小调整宏将不再工作;数组大小调整宏,即确定行数的宏将继续工作。另一个结果是,您将无法再声明比初始值设定项更多

这是我找到的一种通过地址进行引用的方法,我知道还有很多其他方法,有人能列出其他方法吗?如何有效地进行2D引用??我的代码有点破旧,所以有人能建议其他方法吗?逗号分隔的语句在第二个while循环中是如何工作的???编译器如何处理这些语句有任何特殊情况

有人能列出其他方法来有效地进行二维参照吗

最简单的方法是用更传统的s[i][j]替换指针算术**s+i+j中的练习:


这种选择的一个结果是行大小调整宏将不再工作;数组大小调整宏,即确定行数的宏将继续工作。另一个结果是,您将无法再声明比初始值设定项更多的项,因为其余项将被设置为空指针,从而打破打印循环。

您是否有急事?我只是想确定长度,而无需将其传递给使用*s[10]和s[20][10]尝试过的模块和**s但循环甚至没有继续。len返回为0,因此在此结束,所以还有其他方法。@dasbLinkedLightThank@dasbLinkedLight将2D数组传递给函数的其他方法为什么字符串长度**s在这里和字符串长度*s[10]不起作用,这些方法产生错误的结果。这是传递它的方法还是规则。@Krishnasundar看一下编辑,它显示了如何初始化指针数组。
#include<stdio.h>
#include<stdlib.h>

int string_length(int (*s)[10], int L, int W)
{
  int len = 0;
  int i, j;
  for (i = 0; i < L; i++)
  {
    for (j = 0; j < W; j++)
    {
      len++;
      printf("%d ", *(*(s + i) + j));
    }
    printf("\n");
  }
  return len;
}

int main(int argc, char** argv)
{
  int str[20][10] =
  {
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 },
    { 2, 1, 3, 1, 1, 1, 1, 1, 1, 1 } 
  };

  printf("the sizeof this 2d array will be %lu \n", sizeof(str));
  printf("the length of the strings will be %lu \n",
      sizeof(str) / sizeof(str[0]));
  printf("the width of the each string %lu \n",
      sizeof(str[0]) / sizeof(str[0][0]));
  printf("the result is %d \n",
      string_length(str, sizeof(str) / sizeof(str[0]),
          sizeof(str[0]) / sizeof(str[0][0])));

  int i = 0;
  while (i < 10)
    printf("hello %d\n", i), i++;

  return 0;
}
for(i=0;i<L;i++) {
    for(j=0;j<W;j++) {
        len++;
        printf("%d ", s[i][j]); <<== Here
    }
    printf("\n");
}
int string_length(int **s,int L,int W) {
    ... // This code does not change from the above
}
int *str[5]={
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1},
    (int[]){2,1,3,1,1,1,1,1,1,1}
};
printf("the result is %d \n",string_length(str, 5, 10));