指针和一位数组
#include <stdlib.h>#include <stdio.h>
#include <time.h>
//函数声明
void array();
int main()
{
array();//调用函数
system ("pause");
return 0;
}
//函数定义
void array()
{
int n;
int i,j,idx,num,MAX;
int* M; //定义一个一维数组指针,按行优先存储矩阵中的元素
printf("请输入n:");
input:
scanf("%d",&n);
if (n % 2 == 0)// n是偶数,则重新输入
{
printf("n不为奇数,请重新输入:");
goto input;
}
MAX = n*n; //幻方中的最大值,也是元素个数
M = (int*)malloc(sizeof(int)*MAX);//分配存储空间
M = 1; //获取数值为1的列表
i = 0;
j = n / 2;
//从2开始确定每个数的存放位置
for(num = 2;num <= MAX; num++)
{
i = i - 1;
j = j + 1;
if((num - 1) % n == 0)//当前数是n 的倍数
{
i = i + 2;
j = j - 1;
}
if(i < 0) // 当前数在第零行
{
i = n - 1;
}
if(j > n - 1) //当前数在最后一列,即n - 1列
{
j = 0;
}
idx = i*n + j;//根据二维数组下标与元素的对应关系
//找到当前在数组中的存放位置
M = num;
}
//打印生成幻方
printf("生成的%d阶幻方:",n);
idx = 0;
for(i = 0;i < n;i++)
{
printf("\n"); //每n个数据为一行
for(j = 0;j <n;j++)
{
printf("%3d",M);
idx++;
}
}
printf("\n");
free(M);
}
这个代码里没有定义一维数组只定义了一个指针m,指针m也没有指向数组为什么后面指针m不仅能存储值还能把值给打印出来呢? 数组就是一段内存空间,只不过为了好理解才弄成数组的形式
所以M = (int*)malloc(sizeof(int)*MAX);M 就可以用数组形式使用
M等价于*(M+i) jhq999 发表于 2022-12-4 23:06
数组就是一段内存空间,只不过为了好理解才弄成数组的形式
所以M = (int*)malloc(sizeof(int)*MAX);M 就可 ...
我把分配存储空间那段代码注释了为什么程序还能够正常运行? 为什么不摆烂 发表于 2022-12-4 23:42
我把分配存储空间那段代码注释了为什么程序还能够正常运行?
你把int* M=0;试试,
只不过c没有内存保护而已,没付初值的M可能是任意值,只要没覆盖重要的内存空间,就不会报错
页:
[1]