指针数组,二级指针,指向含有N个元素的一维数组的指针,指针的函数调用。

目录

前言:

1.指针数组

2.二级指针

3.指向含有N个元素的一维数组的指针

4.指针的函数调用问题


前言:

指针的应用有很多,使用方法也有很多,形式同样也有很多,下面我们来了解一下这三种形式的指针。

1.指针数组

指针数组顾名思义就是一个数组里面存放的全部都是指针。这就是指针数组。

形式为: *p[N];

 int i,*x[2],a[2][3]={1,2,3,4,5,6};
 for(i=0;i<2;i++)
 x[i]=a[i];//让指针数组中的元素,也就是指针,来指向二维数组
 printf("%d",x[0][1]);
 printf("%d",*(x[0]+1));

输出的都为2;

2.二级指针

首先先了解一下二级指针的定义,二级指针其实就是指向指针的指针。因为我们知道,指针也是变量,所以它也会占用内存单元。所以指针也会有地址,那么就好说了,因为指针就是指向地址的,所以,只要一个变量,或是常量,只要有地址,那么就可以被指针所指向。所以就有了指向指针的指针,也就是二级指针;

 int i,*x,**s,a[3]={1,2,3};
 x=a;//一级指针指向数组a
 s=&x;//二级指针指向一级指针x
 printf("%d",**s);
 printf("%d",*(*s+1));

输出结果为1  2

具体的应用我们下面讲到指针的函数调用时一块讲解;

3.指向含有N个元素的一维数组的指针

这个可能用的不太多,所以听起来比较陌生,但他的用法其实也比较简单;

形式为:  (*p)[N],这种形式的指针,就是指向含有N个元素的一维数组的指针;

指向的是一维数组

int i,*q,(*p)[3],a[3]={11,12,32};
q=a;//直接指向a即可
p=&a;// p指向一维数组a的地址,这里要区分开;普通指针指向一维数组的区别
 printf("%d\n",**p);//取第一次地址是数组a,取第二次地址,才是a中的元素。
printf("%d\n",*(*p+1));

因为(*p)[N]的意思是指向含有N个元素的一维数组的指针,它和普通的指针;指向数组的方式不同

在指向一维数组时,由于a是数组名,代表就是数组首元素的地址。它不是变量,也不占用内存,但是在使用此指针进行指向时,需要对该数组名加取地址符。

这里其实可以抽象的理解一下,当在使用这种类型的指针时,此时一维数组的数组名就成了代表存放这一堆数(把数组中所有的元素看成一个整体);的一个变量名;

int (*p)[5];
int a[5]={1,2,3,4,5};//将其中的这几个元素都看成一个整体x。
int a=x; //此时a就相当于是一个变量名。a的地址就是首个数组元素的地址。

        这时p就可以当作一个普通的指针来使用了。不过要注意的是,不但该指针的类型要和数组一致之外,而且所对应的元素个数也应该保持一致。但取值时,需要经过两次取值符,第一次取a的地址,第二次取其中元素的值。

         其实我觉得也可以理解为汇编语言中的标号。a就相当于汇编中的标号。(可以用LABEL来进行定义变量和标号的类型),而标号一旦定义就具有三个属性:1.段地址  2.偏移地址  3.类型。      标号是不占内存,并且具有地址,我觉得用这样的方式来理解数组名也是比较合理的。如果感兴趣的朋友可以学习一下汇编语言。来了解一下。

        那么多维数组的理解方式,就比较容易了。这里以二维数组为例来进行理解。

 int i,(*p)[3],a[2][3]={1,2,3,4,5,6};
               a[2]={x,y};//抽象理解将0行的全部元素看成x,1行的全部元素看成y即可;
p=a;//指针p指向一维数组a[0]的首地址
 printf("%d",**p);//和上同理,取第一次地址是取a[0],取第二次地址才是a[0]中的元素
 printf("%d",*(*p+3));

        a就是有两个一维数组的数组。而此指针指向的就是一维数组。a就是有两个一维数组的数组。而此指针指向的就是一维数组。普通的指针指向的是数组中的元素,而该指针指向的是数组中的一维数组。

4.指针的函数调用问题

下面举一个例子来说明,指针向函数传递的问题;

int main()
{
int x=3,y=5,*p,*q;
p=&x;q=&y;
fun(p,q);
printf("%d,%d",*p,*q);
}
int fun(int *a,int *b)
{
	int *c;
	c=a;a=b;b=c;
}

此结果是 3,5

      此问题是向函数传递的是指针(也就是a和b的地址),函数用指针来接收地址,所以,在fun函数a指向x的地址,b指向y的地址。进行转换的是a和b的指向交换并没有改变p和q的指向

那么如果想改变p和q的指向应该如何进行改变呢。我们就可以用到上面所讲到的二级指针了。

int fun(int **a,int **b)
{
	int *c;
	c=*a;*a=*b;*b=c;
}
int main()
{ 
 int x=3,y=5*p=&x,*q=&y;
 fun(&p,&q);
 printf("%d,%d",*p,*q);

这是,我们向函数传递的是指针的地址,所以函数我们用二级指针来接收。在函数中定义一个一级指针;用来做转换的跳板。这时在函数中进行转换的就是p和q的指向了。

猜你喜欢

转载自blog.csdn.net/weixin_67118900/article/details/125323028
今日推荐