1
#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;
}

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

4

1 回答 1

0

谁能列出如何有效地完成 2D 参考的其他方法?

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

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

ideone 上的此更改演示与您的原始程序(此处)产生相同的输出。

逗号分隔的语句在第二个 while 循环中是如何工作的?

Comma 是标准的 C 运算符;它充当一个序列点

为了允许传递可变大小的数组 int string_length,您可以更改指针数组的数组结构,如下所示:

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));    

这种选择的一个后果是行大小调整宏将不再起作用(请参阅此处的演示);不过,数组大小调整宏(即确定行数的宏)将继续工作。另一个后果是你不能再声明比你放入初始化器更多的项目,因为其余的将被设置为NULL指针,从而破坏了打印循环。

于 2013-08-09T16:30:50.320 回答