数组指针和指针数组的声明:
#include <stdio.h>
int main()
{
int m[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };/* 定义二维数组m并初始化*/
int(*p)[4];//数组指针 p是指针,指向一维数组,每个一维数组有4个int元素
//p(数组)的元素可以有任意个,通过malloc或者赋值来进行初始化,其中每个元素拥有4个int型元素
int i, j;
int *q[3];//指针数组 q是数组,数组元素是指针,3个int指针
//q是数组,每个数组元素都是int型指针,数组总共有3个元素。如果元素代表的是数组,那么每个元素所指向数组的元素个数是不固定的。
p = m; //p是指针,可以直接指向二维数组
printf("--数组指针输出元素--\n");
for (i = 0; i<3; i++)/*输出二维数组中各个元素的数值*/
{
for (j = 0; j<4; j++)
{
printf("%3d ", *(*(p + i) + j));
}
printf("\n");
}
printf("\n");
for (i = 0; i<3; i++, p++)//p可看成是行指针
{
printf("%3d ", **p);//每一行的第一个元素
printf("%3d ", *(*p + 1));//每一行的第二个元素
printf("%3d ", *(*p + 2));//每一行的第三个元素
printf("%3d ", *(*p + 3));//每一行的第四个元素
printf("\n");
}
printf("\n");
printf("--指针数组输出元素--\n");
for (i = 0; i<3; i++)
q[i] = m[i];//q是数组,元素q[i]是指针
for (i = 0; i<3; i++)
{
for (j = 0; j<4; j++)
{
printf("%3d ", q[i][j]);//q[i][j]可换成*(q[i]+j)
}
printf("\n");
}
printf("\n");
q[0] = m[0];
for (i = 0; i<3; i++)
{
for (j = 0; j<4; j++)
{
printf("%3d ", *(q[0] + j + 4 * i));
}
printf("\n");
}
printf("\n");
return 0;
}
由上面的代码可以分析:
int(*p)[4];
数组指针,就是一个指针,这个指针是指向一个数组,而这个数组里面存放的是元素数固定的数组,也就是说以元素数固定的数组作为元素的指针变量。比如上面的这个声明中,指针p指向数组,每个数组中的元素有4个int型元素。
int *q[3];
指针数组,就是一个数组,这个数组里面的元素是指针,每一个元素所指向的数组所对应的元素数是不固定的。
int main()
{
int *matrix1[3]; // array of 10 pointers
int(*matrix2)[10]; // pointer to an array of 10 ints
matrix2 = NULL;
//指针数组里面的变量对应的内存块有可能是分散的,也可以表示多维数组
matrix1[0] = new int[3];
matrix1[1] = new int[4];
matrix1[2] = new int[5];
int tt = 0;
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < i + 3; j++)
{
//两种初始化方法
//matrix1[i][j] = tt++;
*(*(matrix1 + i) + j) = tt++;
}
}
//数组指针中的内存块必须是连续的才可以表示多维数组
tt = 0;
matrix2 = new int[][10];
int(*matrix3)[10] = matrix2;
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 10; j++)
{
//两种初始化方法
*(*matrix3 + j) = tt++;
//*(*(matrix2 + i) + j) = tt++;
}
matrix3++;
}
return 0;
}