C语言: 用指针访问二维数组 + 二级指针开辟空间

怎样用指针访问二维数组呢?

先来回忆一下怎样用指针访问一维数组。在访问一位数组时,我们实际上声明的是一个和数组元素类型相同的指针变量,指向了数组第一个元素的地址,然后在用这个指针访问数组。

比如访问 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;
}

在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/haduwi/article/details/106456593