C語言更多查看
二級指針又叫雙指針。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;
- }
#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;
- }
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;
- }
#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; }
當想改變指針的值的時候不妨考慮使用二維指針。