之 指針數組與指向指針的指針數組
指針的普遍用途不單單在於數組指針、函數指針等,能夠說沒有指針不能指的東西,那指針還能指什麼呢?ide
今天和你們一塊兒學習指針的最後一篇,指針數組和指向指針的指針以及指針數組作main函數參數。可能你會以爲咱們一直學的不就是指針數組嗎?錯!咱們以前學的是數組指針,這兩個概念但是千差萬別的哦!一樣的,你是否是對指向指針的指針也產生了迷惑呢? 不用着急,一塊兒來看一下吧!函數
一:指針數組一個數組中的全部元素都爲指針類型的數據,這個數組就是指針數組。顯而易見的,學習
指針數組的元素的數據類型爲指針類型,是指針量組成的數組。spa
而數組指針中的數組的元素是非指針類型,而是指針變量指向數組首地址。指針
指針數組的通常形式:blog
類型名 *數組名[數組長度]排序
好比: int *p[4]; 圖片
不要寫成 int (*p)[4],這是一個指向一維數組的行指針字符串
咱們以前學過,字符串是存放在字符數組之中的,以下所示爲一個字符串在數組中的存儲。
z |
h |
a |
o |
y |
u |
q |
\0 |
咱們能夠定義一個指針數組,讓該數組中的每個指針類型的元素指向各字符串中的字符。
以下圖所示:
這樣的好處是:節約指向,移動指針變量的值比移動字符串所花的時間更好,效率也高。
/* 字符串按從小到大排序 */ #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; } } } } |
一個指針變量中存放的是一個指針變量的指針,那麼這個指針變量就是指向指針變量的指針變量,簡稱爲指向指針的指針。定義爲**p
好比:
int i=2,*p1,**p2; p1=&i; p2=&p1; |
上述代碼能夠描述爲如下簡圖:
很明顯的看出,指針變量p2存儲着指針變量p1的地址,而p1又存儲着變量i的地址。
這樣的話,對變量i的訪問就有三種方式了 ,分別是:i , *p1 , **p2
咱們前面剛講過了指針數組,指針數組中都是指針變量,可是它們確實是組成了一個數組,既然是數組,咱們能夠設一個指針變量來指向這個數組,也就是指向數組首地址,也就是指向了數組的第一個指針元素,這是指針指向指針,因此用到了指向指針的指針。
/* 字符串輸出 */ #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函數參數,不過咱們就不說,由於在這一階段這個並非咱們研究的範圍。