|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <stdio.h>
- int main()
- {
- int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- int (*p)[3] = (int (*)[3])&array;
- printf("%d\n", p[2][2]);
- 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[MAX];
- scanf("%s", str);
- length = strlen(str);
- aver = sqrt(length);
- for (i = 0; i < aver; i++)
- {
- for (j = 0; j < aver; j++)
- {
- printf("%c ", str[i * aver + j]);
- }
- printf("\n");
- }
- return 0;
- }
复制代码
没看懂最后输出为什么这也写。。而且,如果 我输入 5个字符,,最后一个字符打印不出来,应该是因为aver=sqrt(length) 这里是小数,用了int 舍去小数点后的了。
本帖最后由 jackz007 于 2020-12-13 22:33 编辑
- int array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
- int (*p)[3] = (int (*)[3]) & array ;
复制代码
这两句定义了一个有 9 个元素的一维数组 array,还定义了一个指向末维为 3 的二维数组指针 p,并且,使此指针指向 array 起始地址,如果通过 p 访问 array 元素,则需要同时提供 2 个参数,例如,* (* (p + i) + j) 或 p[i][j] 来进行访问。二维数组在内存中其实是按照一维数组的形式存储的,也就是说,完全可以把 array 看成一个具有 3 行 3 列的二维数组。那么,如果用 k 来代表一维数组的下标索引,用 i、j 分别代表二维数组的行、列的下标索引,那么,k 和 i、j 之间有如下的换算关系:
那么,p[2][2] 对应的 i 和 j 都是 2,根据上面的换算关系,k = 8,那么,array[8] 的值正好就是 9。
|
|