二級指針又叫雙指針。C語言中不存在引用,所以當你試圖改變一個指針的值的時候必須使用二級指針。C++中可以使用引用類型來實現。
下面講解C中的二級指針的使用方法。
例如我們使用指針來交換兩個整型變量的值。
錯誤代碼如下:
一級指針
- #include?<stdio.h>??
- ??
- void?swap(int?*a,int?*b)??
- {??
- ????????int?*tmp=NULL;??
- ????????tmp=a;??
- ????????a=b;??
- ????????b=tmp;??
- }??
- ??
- int?main(int?argc,char?**argv)??
- {??
- ????????int?a=2;??
- ????????int?b=3;??
- ????????printf("Before?swap?a=%d??b=%d\n",a,b);??
- ????????swap(&a,&b);??
- ????????printf("After?swap?a=%d??b=%d\n",a,b);??
- ????????return?0;??
- }??
輸出的結構如下:
結果分析:不論是數值還是指針,swap函數中的參數傳遞的是總是值,所以在上述函數中即使a和b的地址已參數傳遞給swap函數,而在函數內交換的是a和b的值(main函數中a的地址和b的地址),而交換完畢,函數相應的參數從棧中彈出,并不能返回給調用函數,所以該swap函數中的操作是徒勞。
這里完全可以直接交換a和b的值,不過如果a和b不是一個32位的整型變量,而是一個復雜的數據結構,這樣做會降低效率。如下;
- void?swap(TYPE?*a,TYPE?*b)??
- {??
- ????????TYPE?tmp;??
- ????????tmp=*a;??
- ????????*a=*b;??
- ????????*b=tmp;??
- }??
二級指針
下面是使用二級指針分配內存的例子
- #include?<stdio.h>??
- #include?<stdlib.h>??
- #include?<string.h>??
- void?memorylocate(char?**ptr)??
- {??
- ????????*ptr=(char?*)malloc(10*sizeof(char));??
- }??
- int?main(int?argc,char?**argv)??
- {??
- ????????char?*buffer;??
- ????????memorylocate(&buffer);??
- ????????strcpy(buffer,"12345");??
- ????????printf("buffer?%s\n",buffer);??
- ????????return?0;??
- }??
當想改變指針的值的時候不妨考慮使用二維指針。