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函數參數,不過咱們就不說,由於在這一階段這個並非咱們研究的範圍。

相關文章
相關標籤/搜索