在使用malloc()函数申请动态数组,重新对多维数组与多重指针之间的关系的思考:数组名就是指针,可以用多重指针和数组的方式访问;顺便对嵌套循环效率的一些解释。

本文详细讲解了如何在C语言中使用malloc和calloc函数创建动态数组,包括一维和多维数组的实现,并探讨了指针与数组之间的关系。此外,还讨论了for循环嵌套对程序效率的影响,尤其是在处理内存数据时,如何优化循环结构以提高CPU缓存的命中率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.先从用malloc()函数申请多维动态函数说起。

C语言中用普通的方式定义的数组其大小不能改变。如通过int a[N];定义大小为N的整型数组,其后N的改变不会再改变原来数组大小。但我们可以通过malloc()或calloc()等动态存储分配函数申请分配一块空间,将其返回的所分配单元的起始地址赋给指针,我们就可以利用得到的指针进行和数组一样的操作。因为我们知道普通的数组名其实就是数组的起始地址,相当于一个指针常量。

1.定义一个大小为n的整型动态数组,如下:

 int *a;

   int n;

   n = 10; //此处设为10

   a =(int *)malloc(sizeof(int)*n); /*动态分配存放10个整型的内存,将所分配空间起始地址转换为

                                                         整型地址赋给指针a*/

   a[5] = 100;                                  /*引用同一般数组,但不应超出所分配内存的大小

                                                       a[5]相当于*(a+5), 即从首地址向后跳过5个(整型)内存*/

   free(a);                                        //释放a所指的内存区

在知道地址和变量类型的情况下,a[i]等同于*(a+i),即从首地址开始跳过i个已知类型的数据元素。这两个内存函数原型为void *malloc(usigned size);和void *calloc(unsigned n, unsign size);它们包含在<stdlib.h>中。两者区别有二:一是前者分配size个字节大小的连续空间,后者分配n个size字节的连续空间。二是后者分配的内存初始化为0;而前者没有;如果想改变一个已分配地址的内存区的大小可以用函数void *realloc(void *p, unsign size)。这几个函数返回void 指针类型,赋值给其他类型指针时,需经过类型转换,系统一般在编译时也进行隐式转换。

2.定义一个三维动态数组大小为n1,n2,n3

想得到多维的的动态数组,可以嵌套使用前面的方法,如将得到的动态数组的元素a[i]再定义为动态数组。即定义指向指针的指针,由外向内逐级分配空间。

int ***a; //定义指针的指针的指针

int n1, n2, n3;

int i, j, k;

scanf("%d%d%d",&n1,&n2,&n3);

a=(int ***)malloc(n1*sizeof(int **));  /*a有n1个元素,每个元素仍为数组(其实是指针的指针)

                                                        a为数组首地址,a[1],a[2],...,a[n1]为其子数组元素首地址,以此类推直至得到元素*/
for(i=0; i<n1; i++)

{
   
   
   a[i]=(int **)malloc(n2*sizeof(int *));  //a[i]有n2个元素,每个元素为一维数组的首地址(其实是指针)
   
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值