马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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。
|