Dadong丶 发表于 2020-12-13 22:05:33

小甲鱼C 课后作业24

#include <stdio.h>

int main()
{
      int array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
      int (*p) = (int (*))&array;

      printf("%d\n", p);

      return 0;
}


为什么输出是9???

#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAX 1024

int main()
{
      int length, aver;
      int i, j;
      char str;

      scanf("%s", str);

      length = strlen(str);
      aver = sqrt(length);

      for (i = 0; i < aver; i++)
      {
                for (j = 0; j < aver; j++)
                {
                        printf("%c ", str);
                }
                printf("\n");
      }

      return 0;
}


没看懂最后输出为什么这也写。。而且,如果 我输入5个字符,,最后一个字符打印不出来,应该是因为aver=sqrt(length)这里是小数,用了int 舍去小数点后的了。

jackz007 发表于 2020-12-13 22:31:36

本帖最后由 jackz007 于 2020-12-13 22:33 编辑

      int array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
      int (*p) = (int (*)) & array ;
      这两句定义了一个有 9 个元素的一维数组 array,还定义了一个指向末维为 3 的二维数组指针 p,并且,使此指针指向 array 起始地址,如果通过 p 访问 array 元素,则需要同时提供 2 个参数,例如,* (* (p + i) + j) 或 p 来进行访问。二维数组在内存中其实是按照一维数组的形式存储的,也就是说,完全可以把 array 看成一个具有 3 行 3 列的二维数组。那么,如果用 k 来代表一维数组的下标索引,用 i、j 分别代表二维数组的行、列的下标索引,那么,k 和 i、j 之间有如下的换算关系:
      i* 3 + j= k
      那么,p 对应的 i 和 j 都是 2,根据上面的换算关系,k = 8,那么,array 的值正好就是 9。

卢同学 发表于 2020-12-14 16:32:41

旁观者是我

Dadong丶 发表于 2020-12-14 19:35:37

jackz007 发表于 2020-12-13 22:31
这两句定义了一个有 9 个元素的一维数组 array,还定义了一个指向末维为 3 的二维数组指针 p,并 ...

(*p) 是二维数组?   *p又是什么?

jackz007 发表于 2020-12-14 19:52:32

Dadong丶 发表于 2020-12-14 19:35
(*p) 是二维数组?   *p又是什么?

      3个元素的指针数组
页: [1]
查看完整版本: 小甲鱼C 课后作业24