程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中的二級指針(雙指針),c語言指針

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

編輯:關於C語言

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


原創作品,轉載請標明出處http://blog.csdn.net/yming0221/article/details/7220688 C語言更多查看 C語言使用注意事項(一) C語言使用注意事項(二) C語言使用注意事項(三)

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

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

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

錯誤代碼如下:

一級指針

 

[cpp] view plaincopyprint?
  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位的整型變量,而是一個復雜的數據結構,這樣做會降低效率。如下;

 

[cpp] view plaincopyprint?
  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;
}

 

 

二級指針

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

 

[cpp] view plaincopyprint?
  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;
}

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved