怎样用指针访问二维数组呢?
先来回忆一下怎样用指针访问一维数组。在访问一位数组时,我们实际上声明的是一个和数组元素类型相同的指针变量,指向了数组第一个元素的地址,然后在用这个指针访问数组。
比如访问 int b[3]= {1,2,3}
:
-
b 中的元素为int类型,所以我们要声明一个int类型的指针变量 如int *p ,然后将p指向b的第一个元素的地址,即p = &b[0],数组的首地址和第一个元素的地址是一样的,所以也可以用p=b。
-
这里需要强调的是,指针类型和数组元素的类型一致,而不是数组类型一致,比如b的类型是有三个int类型元素的数组,而b中元素是int类型,b是数组类型,而元素是int类型,是不一样的。上面之所以能够用p=b,不是说p是数组类型的指针,只是数组的首地址,和数组中第一个元素的地址一样罢了。 p是个int类型的指针而不是数组类型的指针,这一点一定要记住!!!
回到二维数组来,拿int a[2][3]= {1,2,3,4,5,6}来说, 数组a的元素为 一个含有三个int类型数据的数据,即a的元素是一个一维数组,这个数组含3个元素!!!
比如访问 int a[2][3]= {1,2,3,4,5,6}
:
-
那么怎样声明指向a数组中元素的指针变量呢?方法及是先声明一个该类型的变量,然后加上*即可
-
a中元素为含有3个int数据的数组,定义这样一个普通变量为: int p[3],然后在变量名前面加上 * 即可,但是要注意运算符的优先级,因为 * 的优先级比[]低,所以要加括号,即int (*p)[3]。
-
这样再将p指向a的第一个元素的地址:
p = &a[0]
,然后就可以用p来访问数组a啦!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};
int (*p)[3] = &a[0];
printf("值为:%d\n",(*p)[0]);
printf("值为:%d\n",(*p)[1]);
printf("值为:%d\n",(*p)[2]);
p++;
printf("值为:%d\n",(*p)[0]);
printf("值为:%d\n",(*p)[1]);
printf("值为:%d\n",(*p)[2]);
getchar();
return 0;
}
三级指针亦是这样的做法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a[2][3][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
int (*p)[3][4] = &a[0];
int i = 0;
for(;i < 3; i++)
{
int j = 0;
for(; j < 4;j++)
printf("值为:%d\n",(*p)[i][j]);
}
p++;
i = 0;
for(;i < 3; i++)
{
int j = 0;
for(; j < 4;j++)
printf("值为:%d\n",(*p)[i][j]);
}
return 0;
}
二级指针开辟空间图解以及操作
定义一个二级指针:
char** p = (char **)malloc(sizeof(char*) * 3);
这里定义并初始化了一个二级指针,指针长度是3个 sizeof(char)
指针长度,如果想往指针里添加内容,可以这样操作:
char* s = "hello";
p[0] = (char *)malloc(strlen(s));
strcpy(p[], s);
看看,是不是很简单?这里需要强调的是,虽然我们操作二级指针采用了 p[0] 这种类似于数组索引的操作方式,但二级指针跟数组是完全不同的概念,千万不要弄混淆。
指针数组:
既然提到了二级指针,那就不得不说说指针数组了。
首先我们来定义一个指针数组:
char *words[2] = {"hello", "nice"};
这个数组包含2个元素,每个元素都是char类型的指针。
有些小伙伴可能对指针数组和数组指针的区别不是很了解,这里还是简单说一下,指针数组他首先是一个数组,只不过他的元素都是指针;而数组指针他首先是一个指针,指向的是一个数组,其实看看最后两个字到底是指针还是数组就很容易分辨了。
案例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test(char** p, int size) {
int i;
for (i = 0; i < size; i ++) {
printf("%s\n", p[i]);
}
}
int main() {
char *words[2] = {"hello", "nice"};
test(words, 2);
return 0;
}
- 两者具体区别请跳转:数组指针和指针数组的区别