指针数组和数组指针

一、指针数组

        在这一节中我们来学习一个数组,这个数组比较特殊,也比较普通。说它特殊是因为这个数组是指针的数组,也就是说我们有一个数组,这个数组里存放的变量类型是指针型变量;说它普通是因为数组变量其实与其它普通变量没有什么区别,指针变量就是一种可以存放内存地址的变量,所以它们也可以被定义成一串连续的变量集合,这个集合就是指针数组。例如,我们可以定义一组变量,这组变量就是一个数组,共有4个元素,而每一个元素都是一个指向int型变量的指针:

int a = 0;
int b = 1;
int c = 2;
int d = 3;

int *p[4];

p[0] = &a;
p[1] = &b;
p[2] = &c;
p[3] = &d;

printf("%d\n", *p[0]);
printf("%d\n", *p[1]);
printf("%d\n", *p[2]);
printf("%d\n", *p[3]);

        在这里我们要注意一下运算符的优先级,由于 * 的优先级比 [] 的优先级低,所以整个表达式中p要先与[4]做结合表示的是一个数组,再与 * 结合表示每一个数组元素的类型是一个指针变量。我们再来看一看多维数组与多维指针数组:

int array[2][3] =
{
{ 0, 1, 2 },
{ 3, 4, 5 }
};
int *p[2][3];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
p[i][j] = &array[i][j];
}
}
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d “, *p[i][j]);
}
printf(”n");
}

        值得注意的地上是多维数组表示的是整型多维数组表示的是很数组中每一个元素的类型都 是型型的变量,而多维指针数组中表示的是数组中每一个元素的类型都是指针型变量。而在循环赋值时我们将数组指针数组中的每一个指针都指向了整型数组中的每一个元素。

二、指针数组与数组指针

        接下来我们来看一看一个非常容易混淆的两个概念:“指针数组”与“数组指针”。

指针数组:表示的是一个数组,数组中每一个变量都是指针型变量;

数组指针:表示的是一个指针类型的变量,这个指针变量指向的是一个数组。

        我们用一个例子来仔细对它们的区别做说明:

int array[2][3] =
{
{ 0, 1, 2 },
{ 3, 4, 5 }
};

//指针数组
int *p[2][3];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
p[i][j] = &array[i][j];
}
}

for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d “, *p[i][j]);
}
printf(”\n");
}

//数组指针
int (*q)[3] = array;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d “, q[i][j]);
}
printf(”\n");
}

        对于上面程序中两种不同的指针数组和数组指针请大家一定要分清。int *p[2][3];所表示的是一个二维数组,数组的每一个元素都是一个指针变量。也就是说,这是一个具有6个指针型变量的数组;而int (*q)[3] = array;所表示的是数组指针,注意:这里只定义了一个指针型变量q,它指向一个二维数组array。而对于q来说,它告诉编译器,这是一个指针,这个指针指向一个具有3列的数组变量。

        关于这两个概念不太容易理解,请大家自己动手编写相关的程序,通过编写程序、查看其运行结果来慢慢消化这两个概念,并熟练掌握它们的原理与用法。


你可能感兴趣的:(指针数组和数组指针)