鱼C论坛

 找回密码
 立即注册
查看: 2542|回复: 3

[已解决]指针和一位数组

[复制链接]
发表于 2022-12-4 21:51:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[n / 2] = 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[idx] = 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]);
                                idx++;
                        }
                }
                printf("\n");   
                free(M);
        }
这个代码里没有定义一维数组只定义了一个指针m,指针m也没有指向数组为什么后面指针m不仅能存储值还能把值给打印出来呢?
最佳答案
2022-12-4 23:06:25
数组就是一段内存空间,只不过为了好理解才弄成数组的形式
所以M = (int*)malloc(sizeof(int)*MAX);M 就可以用数组形式使用
M[i]等价于*(M+i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-4 23:06:25 | 显示全部楼层    本楼为最佳答案   
数组就是一段内存空间,只不过为了好理解才弄成数组的形式
所以M = (int*)malloc(sizeof(int)*MAX);M 就可以用数组形式使用
M[i]等价于*(M+i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我把分配存储空间那段代码注释了为什么程序还能够正常运行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-5 07:33:03 | 显示全部楼层
为什么不摆烂 发表于 2022-12-4 23:42
我把分配存储空间那段代码注释了为什么程序还能够正常运行?

你把int* M=0;试试,
只不过c没有内存保护而已,没付初值的M可能是任意值,只要没覆盖重要的内存空间,就不会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表