鱼C论坛

 找回密码
 立即注册
查看: 1190|回复: 4

[已解决]S1E24第一题

[复制链接]
发表于 2020-10-1 15:07:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        char matrix[3][5] = {
                'I', 'l', 'o', 'v', 'e',
                'F', 'i', 's', 'h', 'C',
                '.', 'c', 'o', 'm', '!'
        };
        char *p;

        p = &matrix[0][3];

        printf("%c", *p);
        printf("%c", *p++);
        printf("%c", *++p);
        printf("\n");

        return 0;
}
不是很懂“由于二维数组实质上是一维数组的线性扩展,所以 ++p 指向的是第二行第一个元素('F')”这段话
最佳答案
2020-10-1 15:45:09
  1. // 如果不上机,你能看出下边代码将打印什么值吗?假如定义了二维数组 int matrix[4][5] = {0};,请问 matrix 和 matrix + 0 的含义一样吗?

  2. #if(0)

  3. #include <stdio.h>

  4. int main()
  5. {
  6.         char matrix[3][5] = {
  7.                 'I', 'l', 'o', 'v', 'e',
  8.                 'F', 'i', 's', 'h', 'C',
  9.                 '.', 'c', 'o', 'm', '!'
  10.         };
  11.         char *p;

  12.         p = &matrix[0][3];

  13.         printf("%c", *p);    // 输出0行3列的值,即字符 v
  14.         printf("%c", *p++);  // 输出0行3列的值之后,指针加1,此时指针指向了0行4列的字符,即字母 e
  15.         printf("%c", *++p);  // 先使指针加1,指针便指向了1行1列的字符,输出1行1列的值,即字母F
  16.         printf("\n");

  17.         return 0;
  18. }

  19. #endif


  20. // 假设有二维数组如下,请问 *(matrix + 1) + 2 的含义是?

  21. #if(0)

  22. #include <stdio.h>

  23. int main()
  24. {
  25.     char matrix[3][5] = {
  26.         'I', 'l', 'o', 'v', 'e',
  27.         'F', 'i', 's', 'h', 'C',
  28.         '.', 'c', 'o', 'm', '!'
  29.         };
  30.     printf("%c\n",*matrix);               // 字符数组的首地址,即 &matrix[0][0]
  31.     printf("%c\n",*(matrix + 1));         // 第二行第一个元素的地址&matrix[1][0]
  32.     printf("%c\n",*(matrix + 1) + 2);     // *(matrix + 1) + 2 的含义是一个指向字符变量的指针,其值是
  33.                                               // 二维数组 matrix 第二行第三个元素的地址(即 &matrix[1][2])
  34.     printf("%c\n",*(*(matrix + 1) + 2));  // 这才是第二行第三个元素的值,输出 s
  35. }

  36. #endif


  37. // 请问下边代码将打印什么值?

  38. #if(0)

  39. #include <stdio.h>

  40. int main()
  41. {
  42.         char array[2][3][5] = {
  43.                 {
  44.                         {'a', 'b', 'x', 'x', 'x'},   // 原题a、b位置都是x
  45.                         {'x', 'x', 'o', 'x', 'x'},
  46.                         {'x', 'x', 'x', 'x', 'x'}
  47.                 },
  48.                 {
  49.                         {'x', 'x', 'x', 'x', 'x'},
  50.                         {'x', 'x', 'w', 'x', 'x'},   // 原题 w 位置是o
  51.                         {'x', 'x', 'x', 'x', 'x'}
  52.                 }
  53.         };
  54. // 下面语句分别输出array[0][1][2]、array[1][1][2]、array[0][0][0]、array[0][0][1] 的值,即 owab
  55.         printf("%c%c%c%c\n", *(*(*array + 1) + 2), *(*(*(array + 1) + 1) + 2), ***array, *(**array + 1));  // **array 是一个指向指针数据的指针变量,相当于*(*p)

  56.         return 0;
  57. }

  58. #endif

  59. // 如果不上机,你能看出下边代码将打印什么值吗?

  60. #if(0)

  61. #include <stdio.h>

  62. int main()
  63. {
  64.         int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  65.         int (*p)[3] = (int (*)[3])&array;  // int(*)[3]是指向int[3]这个数组类型的指针的类型,
  66.                                                    // int(*p)[3]是这种类型的一个名称为p的对象
  67.                                                    // 所以,array 前面的 & 是可有可无的

  68.         printf("%d\n",p[2][2]);            // a[2][2] 的值为 *(*(p + 2) + 2)

  69.         return 0;
  70. }

  71. #endif


  72. // 编写一个程序,接收用户的输入,并将前 9 个字符以正方形矩阵(3 * 3)的方式输出。
  73. #if(0)

  74. #include <stdio.h>

  75. int main()
  76. {
  77.         int matrix[3][3] = {0};   // 定义一个三维数组并初始化
  78.         int i, j;

  79.         for (i = 0; i < 3; i++)
  80.         {
  81.             for (j = 0; j < 3; j++)
  82.             {
  83.                 matrix[i][j] = getchar();  // 接收用户从键盘输入
  84.             }
  85.         }

  86.         for (i = 0; i < 3; i++)
  87.         {
  88.             for (j = 0; j < 3; j++)
  89.             {
  90.                 printf("%c ", matrix[i][j]);  // 输出 3 x 3 矩阵
  91.             }
  92.             printf("\n");
  93.         }


  94.         return 0;
  95. }

  96. #endif


  97. #if(0)
  98. #include <stdio.h>

  99. int main()
  100. {
  101.     int array[2][5] = {{0, 1, 2, 3, 4},{ 5, 6, 7, 8, 9}};
  102.     int (*p)[5] = array ;        // 定义一个一维的指针变量,并将数组的首地址赋给它

  103.     printf("%d\n",*(*(p+1)+2));  // 输出第1行第2列的值 7
  104.     printf("%d\n",array[1][2]);

  105.     return 0;
  106. }

  107. #endif


  108. //不限制正方形矩阵的尺寸,要求程序自动计算用户输入的字符,并以最大的正方形矩阵输出(比如用户输入 17 个字符,输出 4 * 4 矩阵)
  109. #if(0)

  110. #include <stdio.h>
  111. #include <string.h>
  112. #include <math.h>

  113. #define MAX 1024

  114. int main()
  115. {
  116.         int length, aver;
  117.         int i, j;
  118.         char str[MAX];

  119.         scanf("%s", str);

  120.         length = strlen(str);
  121.         aver = sqrt(length);    // 从double 型转换到 int 型,会有数据丢失的告警

  122.         for (i = 0; i < aver; i++)
  123.         {
  124.                 for (j = 0; j < aver; j++)
  125.                 {
  126.                         printf("%c ", str[i * aver + j]);
  127.                 }
  128.                 printf("\n");
  129.         }

  130.         return 0;
  131. }

  132. #endif


  133. // 编写一个程序,用户输入待查询年月份(输入格式:2015-03),输出该月份的 PM2.5 值
  134. #if(0)

  135. #include <stdio.h>

  136. int main()
  137. {
  138.         float pm25[3][12] = {
  139.                 {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
  140.                 {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
  141.                 {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
  142.         };                                        // 将const double类型的值直接赋予float类型变量,引发18个告警
  143.         int year, month;

  144.         printf("请输入待查询年月分(年-月): ");
  145.         scanf("%d-%d", &year, &month);

  146.         if (year < 2014 || year > 2016 || month < 1 || month > 12)
  147.         {
  148.                 printf("输入数据错误!\n");
  149.         }
  150.         else
  151.         {
  152.                 year -= 2014;
  153.                 month -= 1;
  154.                 if (pm25[year][month])
  155.                 {
  156.                         printf("%d年%d月广州的PM2.5值是: %.2f\n", year + 2014, month + 1, pm25[year][month]);
  157.                 }
  158.                 else
  159.                 {
  160.                         printf("抱歉,该月份未收录数据!\n");
  161.                 }
  162.         }

  163.         return 0;
  164. }

  165. #endif


  166. // 将上面所有记录的数据打印为横向直方图
  167. #if(1)

  168. #include <stdio.h>

  169. int main()
  170. {
  171.       float pm25[3][12] = {
  172.                   {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
  173.           {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
  174.           {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
  175.       };                                        // 将const double类型的值直接赋予float类型变量,引发18个告警
  176.       int i, j, step;
  177.       float min, max, data;

  178.       // 找出最大值和最小值
  179.       min = max = pm25[1][0];
  180.       for (i = 0; i < 3; i++)
  181.       {
  182.           for (j = 0; j < 12; j++)
  183.           {
  184.               if (pm25[i][j])
  185.               {
  186.                   min = min > pm25[i][j] ? pm25[i][j] : min;
  187.                   max = max < pm25[i][j] ? pm25[i][j] : max;
  188.               }
  189.           }
  190.       }

  191.      // 计算步进值
  192.       if ((int)(max - min) > 80)
  193.       {
  194.           step = 2;
  195.           }
  196.       else
  197.       {
  198.           step = 1;
  199.       }

  200.       printf("最小值: %.2f, 最大值: %.2f\n", min, max);
  201.       // 打印直方图
  202.       for (i = 0; i < 3; i++)
  203.       {
  204.           for (j = 0; j < 12; j++)
  205.           {
  206.               data = pm25[i][j];
  207.               if (data)
  208.               {
  209.                   printf("%d年%2d月: ", i + 2014, j + 1);
  210.                   while (data >= min)
  211.                   {
  212.                       printf("*");
  213.                       data -= step;
  214.                   }
  215.                   printf("\n");
  216.               }
  217.           }
  218.           }

  219.       return 0;
  220. }

  221. #endif
复制代码
QQ图片20201001150136.png

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-1 15:45:09 | 显示全部楼层    本楼为最佳答案   
  1. // 如果不上机,你能看出下边代码将打印什么值吗?假如定义了二维数组 int matrix[4][5] = {0};,请问 matrix 和 matrix + 0 的含义一样吗?

  2. #if(0)

  3. #include <stdio.h>

  4. int main()
  5. {
  6.         char matrix[3][5] = {
  7.                 'I', 'l', 'o', 'v', 'e',
  8.                 'F', 'i', 's', 'h', 'C',
  9.                 '.', 'c', 'o', 'm', '!'
  10.         };
  11.         char *p;

  12.         p = &matrix[0][3];

  13.         printf("%c", *p);    // 输出0行3列的值,即字符 v
  14.         printf("%c", *p++);  // 输出0行3列的值之后,指针加1,此时指针指向了0行4列的字符,即字母 e
  15.         printf("%c", *++p);  // 先使指针加1,指针便指向了1行1列的字符,输出1行1列的值,即字母F
  16.         printf("\n");

  17.         return 0;
  18. }

  19. #endif


  20. // 假设有二维数组如下,请问 *(matrix + 1) + 2 的含义是?

  21. #if(0)

  22. #include <stdio.h>

  23. int main()
  24. {
  25.     char matrix[3][5] = {
  26.         'I', 'l', 'o', 'v', 'e',
  27.         'F', 'i', 's', 'h', 'C',
  28.         '.', 'c', 'o', 'm', '!'
  29.         };
  30.     printf("%c\n",*matrix);               // 字符数组的首地址,即 &matrix[0][0]
  31.     printf("%c\n",*(matrix + 1));         // 第二行第一个元素的地址&matrix[1][0]
  32.     printf("%c\n",*(matrix + 1) + 2);     // *(matrix + 1) + 2 的含义是一个指向字符变量的指针,其值是
  33.                                               // 二维数组 matrix 第二行第三个元素的地址(即 &matrix[1][2])
  34.     printf("%c\n",*(*(matrix + 1) + 2));  // 这才是第二行第三个元素的值,输出 s
  35. }

  36. #endif


  37. // 请问下边代码将打印什么值?

  38. #if(0)

  39. #include <stdio.h>

  40. int main()
  41. {
  42.         char array[2][3][5] = {
  43.                 {
  44.                         {'a', 'b', 'x', 'x', 'x'},   // 原题a、b位置都是x
  45.                         {'x', 'x', 'o', 'x', 'x'},
  46.                         {'x', 'x', 'x', 'x', 'x'}
  47.                 },
  48.                 {
  49.                         {'x', 'x', 'x', 'x', 'x'},
  50.                         {'x', 'x', 'w', 'x', 'x'},   // 原题 w 位置是o
  51.                         {'x', 'x', 'x', 'x', 'x'}
  52.                 }
  53.         };
  54. // 下面语句分别输出array[0][1][2]、array[1][1][2]、array[0][0][0]、array[0][0][1] 的值,即 owab
  55.         printf("%c%c%c%c\n", *(*(*array + 1) + 2), *(*(*(array + 1) + 1) + 2), ***array, *(**array + 1));  // **array 是一个指向指针数据的指针变量,相当于*(*p)

  56.         return 0;
  57. }

  58. #endif

  59. // 如果不上机,你能看出下边代码将打印什么值吗?

  60. #if(0)

  61. #include <stdio.h>

  62. int main()
  63. {
  64.         int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  65.         int (*p)[3] = (int (*)[3])&array;  // int(*)[3]是指向int[3]这个数组类型的指针的类型,
  66.                                                    // int(*p)[3]是这种类型的一个名称为p的对象
  67.                                                    // 所以,array 前面的 & 是可有可无的

  68.         printf("%d\n",p[2][2]);            // a[2][2] 的值为 *(*(p + 2) + 2)

  69.         return 0;
  70. }

  71. #endif


  72. // 编写一个程序,接收用户的输入,并将前 9 个字符以正方形矩阵(3 * 3)的方式输出。
  73. #if(0)

  74. #include <stdio.h>

  75. int main()
  76. {
  77.         int matrix[3][3] = {0};   // 定义一个三维数组并初始化
  78.         int i, j;

  79.         for (i = 0; i < 3; i++)
  80.         {
  81.             for (j = 0; j < 3; j++)
  82.             {
  83.                 matrix[i][j] = getchar();  // 接收用户从键盘输入
  84.             }
  85.         }

  86.         for (i = 0; i < 3; i++)
  87.         {
  88.             for (j = 0; j < 3; j++)
  89.             {
  90.                 printf("%c ", matrix[i][j]);  // 输出 3 x 3 矩阵
  91.             }
  92.             printf("\n");
  93.         }


  94.         return 0;
  95. }

  96. #endif


  97. #if(0)
  98. #include <stdio.h>

  99. int main()
  100. {
  101.     int array[2][5] = {{0, 1, 2, 3, 4},{ 5, 6, 7, 8, 9}};
  102.     int (*p)[5] = array ;        // 定义一个一维的指针变量,并将数组的首地址赋给它

  103.     printf("%d\n",*(*(p+1)+2));  // 输出第1行第2列的值 7
  104.     printf("%d\n",array[1][2]);

  105.     return 0;
  106. }

  107. #endif


  108. //不限制正方形矩阵的尺寸,要求程序自动计算用户输入的字符,并以最大的正方形矩阵输出(比如用户输入 17 个字符,输出 4 * 4 矩阵)
  109. #if(0)

  110. #include <stdio.h>
  111. #include <string.h>
  112. #include <math.h>

  113. #define MAX 1024

  114. int main()
  115. {
  116.         int length, aver;
  117.         int i, j;
  118.         char str[MAX];

  119.         scanf("%s", str);

  120.         length = strlen(str);
  121.         aver = sqrt(length);    // 从double 型转换到 int 型,会有数据丢失的告警

  122.         for (i = 0; i < aver; i++)
  123.         {
  124.                 for (j = 0; j < aver; j++)
  125.                 {
  126.                         printf("%c ", str[i * aver + j]);
  127.                 }
  128.                 printf("\n");
  129.         }

  130.         return 0;
  131. }

  132. #endif


  133. // 编写一个程序,用户输入待查询年月份(输入格式:2015-03),输出该月份的 PM2.5 值
  134. #if(0)

  135. #include <stdio.h>

  136. int main()
  137. {
  138.         float pm25[3][12] = {
  139.                 {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
  140.                 {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
  141.                 {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
  142.         };                                        // 将const double类型的值直接赋予float类型变量,引发18个告警
  143.         int year, month;

  144.         printf("请输入待查询年月分(年-月): ");
  145.         scanf("%d-%d", &year, &month);

  146.         if (year < 2014 || year > 2016 || month < 1 || month > 12)
  147.         {
  148.                 printf("输入数据错误!\n");
  149.         }
  150.         else
  151.         {
  152.                 year -= 2014;
  153.                 month -= 1;
  154.                 if (pm25[year][month])
  155.                 {
  156.                         printf("%d年%d月广州的PM2.5值是: %.2f\n", year + 2014, month + 1, pm25[year][month]);
  157.                 }
  158.                 else
  159.                 {
  160.                         printf("抱歉,该月份未收录数据!\n");
  161.                 }
  162.         }

  163.         return 0;
  164. }

  165. #endif


  166. // 将上面所有记录的数据打印为横向直方图
  167. #if(1)

  168. #include <stdio.h>

  169. int main()
  170. {
  171.       float pm25[3][12] = {
  172.                   {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
  173.           {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
  174.           {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
  175.       };                                        // 将const double类型的值直接赋予float类型变量,引发18个告警
  176.       int i, j, step;
  177.       float min, max, data;

  178.       // 找出最大值和最小值
  179.       min = max = pm25[1][0];
  180.       for (i = 0; i < 3; i++)
  181.       {
  182.           for (j = 0; j < 12; j++)
  183.           {
  184.               if (pm25[i][j])
  185.               {
  186.                   min = min > pm25[i][j] ? pm25[i][j] : min;
  187.                   max = max < pm25[i][j] ? pm25[i][j] : max;
  188.               }
  189.           }
  190.       }

  191.      // 计算步进值
  192.       if ((int)(max - min) > 80)
  193.       {
  194.           step = 2;
  195.           }
  196.       else
  197.       {
  198.           step = 1;
  199.       }

  200.       printf("最小值: %.2f, 最大值: %.2f\n", min, max);
  201.       // 打印直方图
  202.       for (i = 0; i < 3; i++)
  203.       {
  204.           for (j = 0; j < 12; j++)
  205.           {
  206.               data = pm25[i][j];
  207.               if (data)
  208.               {
  209.                   printf("%d年%2d月: ", i + 2014, j + 1);
  210.                   while (data >= min)
  211.                   {
  212.                       printf("*");
  213.                       data -= step;
  214.                   }
  215.                   printf("\n");
  216.               }
  217.           }
  218.           }

  219.       return 0;
  220. }

  221. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 15:47:36 | 显示全部楼层
这是 S1E24 所有题目的答案,在比较难懂之处,我都有注释
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 15:48:49 | 显示全部楼层
意思是二维数组各个元素的地址也是连续的,所以 ++p 指向 e 后面的 F
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 16:08:25 | 显示全部楼层
写成二维数组,那是给程序员看了,对于机器,它是按顺序存贮的,或者说是一维数组的线性扩展

数组的存贮.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 07:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表