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

C语言学习笔记

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

  指针的普遍用途不单单在于数组指针、函数指针等,能够说没有指针不能指的东西,那指针还能指什么呢?ide

  今天和你们一块儿学习指针的最后一篇,指针数组和指向指针的指针以及指针数组作main函数参数。可能你会以为咱们一直学的不就是指针数组吗?错!咱们以前学的是数组指针,这两个概念但是千差万别的哦!一样的,你是否是对指向指针的指针也产生了迷惑呢? 不用着急,一块儿来看一下吧!函数

一:指针数组

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

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

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

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

指针数组的通常形式:blog

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

 好比:      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函数参数,不过咱们就不说,由于在这一阶段这个并非咱们研究的范围。

相关文章
相关标签/搜索