C语言学习笔记【指针04】指针数组与指向指针的指针

C语言学习笔记

之 指针数组与指向指针的指针

  指针的广泛用途不仅仅在于数组指针、函数指针等,可以说没有指针不能指的东西,那指针还能指什么呢?

  今天和大家一起学习指针的最后一篇,指针数组和指向指针的指针以及指针数组做main函数参数。可能你会觉得我们一直学的不就是指针数组吗?错!我们之前学的是数组指针,这两个概念可是千差万别的哦!同样的,你是不是对指向指针的指针也产生了迷惑呢? 不用着急,一起来看一下吧!

一:指针数组

1.什么是指针数组?指针数组与数组指针的区别?

 一个数组中的所有元素都为指针类型的数据,这个数组就是指针数组。显而易见的,

指针数组的元素的数据类型为指针类型,是指针量组成的数组。

而数组指针中的数组的元素是非指针类型,而是指针变量指向数组首地址。

指针数组的一般形式:

              类型名   *数组名[数组长度]

 比如:      int *p[4];  

不要写成    int (*p)[4],这是一个指向一维数组的行指针

    我们之前学过,字符串是存放在字符数组之中的,如下所示为一个字符串在数组中的存储。

z

h

a

o

y

u

q

\0

我们可以定义一个指针数组,让该数组中的每一个指针类型的元素指向各字符串中的字符。

如下图所示:



这样的好处是:节约指向,移动指针变量的值比移动字符串所花的时间更好,效率也高。


2.程序实例:字符串从小到大排序


/*
    字符串按从小到大排序
*/
#include <stdio.h>
#include <string.h>
void sort(char *name[],int n); //声明函数
main()
{
    /*定义指针数组,name[]是指针数组变量,name[0]指向字符串"Zai"*/
    char *name[]={"zai","Demo","C S","Apple"};
    int i,n=4;
    sort(name,n);//调用函数
    for(i=0;i<n;i++)
    {
       printf("%s\n",name[i]); //“%s”允许输出首地址输出整个字符串
    }
}
void sort(char *name[],int n)
{
  char *temp;
  int i,j;
  for(i=0;i<n-1;i++)
  {
     j=0;
     /*一趟排序*/
     for(j=0;j<n;j++)
     {
        if(strcmp(name[j],name[j+1])>0) //比较字符串大小
        {  
            temp=name[j];
            name[j]=name[j+1];
            name[j+1]=temp;
        }          
     }
  }
}



二:指向指针的指针

1.什么是指向指针的指针

一个指针变量中存放的是一个指针变量的指针,那么这个指针变量就是指向指针变量的指针变量,简称为指向指针的指针。定义为**p

  比如:

int i=2,*p1,**p2;
p1=&i;
p2=&p1;

上述代码可以描述为以下简图:

很明显的看出,指针变量p2存储着指针变量p1的地址,而p1又存储着变量i的地址。

这样的话,对变量i的访问就有三种方式了 ,分别是:i , *p1 , **p2

2.程序实例:输出字符串  

   我们前面刚讲过了指针数组,指针数组中都是指针变量,但是它们确实是组成了一个数组,既然是数组,我们可以设一个指针变量来指向这个数组,也就是指向数组首地址,也就是指向了数组的第一个指针元素,这是指针指向指针,所以用到了指向指针的指针。

/*
    字符串输出
*/
#include <stdio.h>
//#include <string.h>
main()
{
    char *name[]={"zhao","yu","qiang","51cto"}; //定义指针数组
    char **p; //定义指向指针的指针,也即是指向指针数组的指针
    for(p=name;p<name+4;p++)
    {
       printf("%s\n",*p);
    }
}


 懂得了指针数组以后,还有一个重要应用,就是指针数组作为main函数参数,不过我们就不说,因为在这一阶段这个并不是我们研究的范围。


你可能感兴趣的:(C语言,指针,指针数组,指向指针)