指针(2)指针数组、数组指针、数组指针数组

都说指针是C语言的精华所在。今天继续对指针的探索!

指针下

一、指针数组、数组指针

       指针数组:是存放指针的数组。    如 int *p[5];  该数组长度为5,存放的是指向整型变量的指针。

       数组指针:是一个指向数组的指针。 如 int (*p)[5];  这是一个指向长度为5的整型数组的指针。

     1.数组指针在一维数组中的应用

                   int a[5]={0};

                   a;//表示数组首元素的地址    &a;//表示数组的地址     虽然它俩取值相同,但是意义却不同。

                   因此可以有:   int (*p1)[5];     p1=&a;//ok                p1=a;//error!

                                            int p2;             p2=&a;//error!           p2=a;//ok

                    p1=&a;//表示的是一个指向数组长度为5的数组 的指针。

                    p2=a;//表示的是指向了一个数组的首地址,也就是一个元素的地址。

                    所以我们在使用时一定要搞清楚,我们想要的是一个元素的地址,还是一个数组的地址。

     2.如何用数组指针获取一维数组的元素?

                  (*p1)[i]==a[i];

                    数组指针(*p1)可以替换数组名 a进行工作。区别在于,一维数组名a相当于一个一级指针常量。而p1是一个指针  

                    变量。因此a不可变,而p1不仅可以指向数组a,还可以指向其它满足要求的数组。(已在vc++6.0环境下验证)

      编码验证:

#include <stdui.h>
int main()
{
	int a[5]={0};
//验证a 与 &a的取值相同
	printf("%p\n",a);
	printf("%p\n",&a);

//验证 a 与 &a 虽然取值相同但是意义不同。
        int (*p1)[5];
	p1=a;//会报错
	p1=&a;

	int *p2;
	p2=&a;//会报错
	p2=a;

//验证数组指针在一维数组中使用方式  (*p1)[i]==a[i];
        for(int i=0;i<5;i++)
	{
		(*p1)[i]=5;//== a[i]=5;
	}
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);//5 5 5 5 5
	}
	printf("\n");

//验证数组指针为变量,可以被再次赋值。
	int b[5]={0};
	p1=&b;
	for(i=0;i<5;i++)//数组指针p1被再次赋值后,对原先被指的数组无影响。
	{
		printf("%d ",a[i]);// 5 5 5 5 5
	}
	printf("\n");
	for(i=0;i<5;i++)
	{
		printf("%d ",(*p1)[i]);// 0 0 0 0 0
	}
	printf("\n");
	return 0;
}

     3.数组指针在二维数组中的应用

              int a[3][4]={0};
              int (*p)[4];     p=a;  //将二维数组中的第一个一维数组的地址赋值给p 即此时p=a[0];也就是第一行元素的地址

             这里a是一个二维数组的数组名,相当于一个二级指针常量;
             p是一个指针变量,它指向一个包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;

             也就是说,此时由 p=a;则p此时指向的是a[0]的地址(第一行的地址),当p+1时,指向的是a[1]的地址(第二行的地

             址)即当p+-整数的时候,是以它指向的一维数组的长度为单位发生移动的。

             用数组指针获取二维数组元素:
            *(p+i)是一维数组a[i][0]的地址;
            *(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。

二、数组指针数组:用来存储数组指针的数组 (了解就好,感觉自己理解的还并不够彻底!)

            如:int (*parr[3])[4];  

             表示:(parr[i])[4]中存储的是一个 长度为4的一维数组的地址。 parr[i][0]相当于该一维数组地址的首地址

             用*(parr[i][0]+j)来获取二维数组中的元素值

             编码示例:

#include<stdio.h>
int main()
{
	int a[3][4]={0};
	//定义 数组指针数组 parr 
	int (*parr[3])[4];
	int i,j;
	//给 parr数组赋值。
       for(i=0;i<3;i++)
	{
	    parr[i]=&a[i];
	}
	//用数组指针数组 parr 改变被指向的二维数组内的值 	*(parr[i][0]+j
	for(i=0;i<3;i++)
	{
		for( j=0;j<4;j++)
		{
			*(parr[i][0]+j)=3;
		}
	}
	//验证上述操作是否有效。输出应为3*4的矩阵且 值全为3
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

后续 指针3

以上内容是全由个人对现阶段所学知识进行的总结整理,如果有任何问题欢迎指出!谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值