C語言中的二級指針(雙指針)


原創作品,轉載請標明出處 http://blog.csdn.net/yming0221/article/details/7220688
C語言更多查看

二級指針又叫雙指針。C語言中不存在引用,所以當你試圖改變一個指針的值的時候必須使用二級指針。C++中可以使用引用類型來實現。

下面講解C中的二級指針的使用方法。

例如我們使用指針來交換兩個整型變量的值。

錯誤代碼如下:

一級指針

 

  1. #include <stdio.h> 
  2.  
  3. void swap(int *a,int *b) 
  4.         int *tmp=NULL; 
  5.         tmp=a; 
  6.         a=b; 
  7.         b=tmp; 
  8.  
  9. int main(int argc,char **argv) 
  10.         int a=2; 
  11.         int b=3; 
  12.         printf("Before swap a=%d  b=%d\n",a,b); 
  13.         swap(&a,&b); 
  14.         printf("After swap a=%d  b=%d\n",a,b); 
  15.         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位的整型變量,而是一個復雜的數據結構,這樣做會降低效率。如下;

 

  1. void swap(TYPE *a,TYPE *b) 
  2.         TYPE tmp; 
  3.         tmp=*a; 
  4.         *a=*b; 
  5.         *b=tmp; 
void swap(TYPE *a,TYPE *b)
{
        TYPE tmp;
        tmp=*a;
        *a=*b;
        *b=tmp;
}

 

 

二級指針

下面是使用二級指針分配內存的例子

 

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <string.h> 
  4. void memorylocate(char **ptr) 
  5.         *ptr=(char *)malloc(10*sizeof(char)); 
  6. int main(int argc,char **argv) 
  7.         char *buffer; 
  8.         memorylocate(&buffer); 
  9.         strcpy(buffer,"12345"); 
  10.         printf("buffer %s\n",buffer); 
  11.         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;
}

當想改變指針的值的時候不妨考慮使用二維指針。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM