本文主要是总结一些关于数组和指针的关系,以及常用的用法。
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;
}