为什么不摆烂 发表于 2022-12-4 21:51:13

指针和一位数组

#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不仅能存储值还能把值给打印出来呢?

jhq999 发表于 2022-12-4 23:06:25

数组就是一段内存空间,只不过为了好理解才弄成数组的形式
所以M = (int*)malloc(sizeof(int)*MAX);M 就可以用数组形式使用
M等价于*(M+i)

为什么不摆烂 发表于 2022-12-4 23:42:48

jhq999 发表于 2022-12-4 23:06
数组就是一段内存空间,只不过为了好理解才弄成数组的形式
所以M = (int*)malloc(sizeof(int)*MAX);M 就可 ...

我把分配存储空间那段代码注释了为什么程序还能够正常运行?

jhq999 发表于 2022-12-5 07:33:03

为什么不摆烂 发表于 2022-12-4 23:42
我把分配存储空间那段代码注释了为什么程序还能够正常运行?

你把int* M=0;试试,
只不过c没有内存保护而已,没付初值的M可能是任意值,只要没覆盖重要的内存空间,就不会报错
页: [1]
查看完整版本: 指针和一位数组