二维数组的指针定义方式——省空间

本文探讨了数组和指针在C语言中的关系,指出数组名可视为首元素的地址,而指针可用于动态内存分配。通过示例说明如何使用指针创建和访问动态分配的一维和二维数组,强调了类型匹配的重要性,并提供了代码示例以展示如何高效地操作这种内存结构。
摘要由CSDN通过智能技术生成

        本文主要是总结一些关于数组和指针的关系,以及常用的用法。

        1、一般的认识里面,指针表示一块内存地址的起点,而对于数组而言,其本质也是一块内存,数组的第一个元素的地址或数组名表示该块内存的首地址;例如

            int *p;

            int a[10];

            p = a;

            此时p指向数组a,p的值和&a[0]以及&a的值相等; 

        2、对于数组a,若想在使用时再进行内存分配(直接定义a[10],则会在定义初始化时便分配内存),则可以使用指针解决。如下:

           int *a;

          a = malloc(sizeof(int) * 10);

          此时a即指针一块容量为10个int型变量的内存,相当于数组,想访问该数组可通过 *(a++)来实现。需要注意的是,指针的类型最好与所存储的变量类型保持一致,避免自己在使用过程中产生误解。

        3、扩展一下,若想定义一个二维数组,但又想尽量节省静态空间,该如何去做?

假设期望定义的二维数组为int b[10][200]; 

       首先将该数组想象为一块内存,但这块内存需要按照二维数组的行列大小进行切分,这样为节省空间,可将数组行和列种最小的一个作为静态变量定义;如下:

      int (*p2)[10];    //定义一个指向10个int型元素的数组;

     p2 = (int (*) [10])malloc(sizeof(int) * 10 * 200);

     上面关于指针p2的内存分配,分配的大小为整个二维数组的大小,赋值给p2时,将其划分为10行; p2++时会移动10*int的大小;访问该二维数组时,可以按照 p2[i][j] (等效为*(*(p2+i) + j), 进行访问。

        上述使用方法的一个典型例子如下:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define ARRAY_X 3

#define ARRAY_Y 4

int main()

{

   int data[ARRAY_X][ARRAY_Y]={0};

   int (*pointer)[ARRAY_Y]=data;

   int i,j,k,num=10;;

   for(i=0; i<ARRAY_X; i++)

   {

        for(j=0;j<ARRAY_Y;j++)

        {

        data[i][j]=num++;

        }  

   }    

   for(i=0; i<ARRAY_X;i++)

   {

        printf("\r\n");

        for(j=0;j<ARRAY_Y;j++)

        {      

            printf("data[%d][%d]:0x%x,(address:0x%-10x)\r\n",i,j,data[i][j],&data[i][j]);

        }  

   }    

for(i=0; i<ARRAY_X;i++)

    {

        printf("\r\n");

        for(j=0;j<ARRAY_Y;j++)

        {          

            printf("*(pointer+%d)+%d: 0x%x\r\n",i,j, *(pointer+i)+j);        

            printf(" *(*(pointer+%d)+%d): 0x%x\r\n",i,j, *(*(pointer+i)+j));

            printf("p[%d][%d]: 0x%x \r\n", i, j, pointer[i][j]);

        }    

    }  

    while(1);

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值