Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android For JNI(三)——C的指針,指針變量,指針常見錯誤,值傳遞,引用傳遞,返回多個值

Android For JNI(三)——C的指針,指針變量,指針常見錯誤,值傳遞,引用傳遞,返回多個值

編輯:關於Android編程

C中比較難的這一塊,大概就是指針了,所以大家還是多翻閱一下資料,當然,如果只是想了解一下,看本篇也就夠了,不過我也盡量陳述的很詳細

一.指針

要說指針,其實通俗易懂的話來說,他應該是保存內存地址的一個變量,我們來看一下小例子

#include     
#include    

main(){             
       //int 變量 
       int i ;
       i = 5;
       //打印i的值
       printf("%d\n",i); 
       //打印i的內存地址 
       printf("%#x\n",&i);

      //定義一個指針變量
      //指針的含義是他是用來保存內存地址的 
       int * j; 
       j= &i; 
        //打印指針 
       printf("%#x",j);


        //讓窗口停留 
        int age ; 
        scanf("%d",&age);

}

從這段話不難看出,我們定義一個i的話可以打印值和內存地址,但是我們定義一個指針j,也是可以賦值一個指針地址的,不信,我們打印一下

這裡寫圖片描述

可以看到,內存地址是一樣的了,所以我們就可以清晰明了的知道了指針的概念了,指針指向的內存地址上村坊的數值是一個int類型

既然指針可以接收到內存地址,那他同樣是可以轉換成值的,我們繼續來看

//打印指針值
printf("%d",*j); 

輸出一個指針int類型的值

這裡寫圖片描述

就是5 了,*p指向內存地址上的值

二進指針

二進指針的概念,他也是一個指針變量,二級指針存放的地址必須是一個一級指針,也就是j

        //定義一個二進指針
       int ** k; 
       //二級指針存放的地址必須是一個一級指針,也就是j
       k = &j; 

       //輸出j的內存地址 
       printf("%#x\n",&j); 
       //打印二級指針‘
       printf("%#x\n",k); 

我們這段運行之後就是k的內存地址和j的是一樣的了

這裡寫圖片描述

指針和指針變量的關系

指針就是地址,地址就是指針 地址就是內存單元的編號 指針變量是存放地址的變量 指針和指針變量是兩個不同的概念 我們陳述的時候會把指針變量說成指針,但是含義不一樣

二.指針常見錯誤

我們有時候會碰到一些梗,這都是需要注意到的,我們定義一個指針

        //定義一個指針,在內存中開辟 
        int * i;
        //打印i的內存地址 
        printf("%#x\n",i); 

沒有給這個i賦值,但是可以打印

這裡寫圖片描述

這裡我們就知道,指針已定義就會有一個值了,這個本身不是錯誤,但是如果你

    *i = 3; 

你就有錯誤了,因為定義的時候是隨機指向一個地址,你現在賦值這個地址為3,就錯誤了,正常是思路是


        //定義一個指針,在內存中開辟 
        int * i;

        i= 5; 
        //打印i的內存地址 
        printf("%#x\n",i);

        *i = 3; 

這樣輸出的才是3
所以我們得到的結論就是指針復制之前,不要是桶*i賦值,指針的類型也不能混用

三,值傳遞和引用傳遞

這個概念在JAVA中也有,在排序中用到的比較多吧,其實就是定義一個中間變量去轉換,我寫個小例子大家就簡單明了了

#include     
#include    

main(){     
        //定義兩個變量 
        int i = 3;
        int j = 5;
        //定義中間變量 
        int temp = i;   //temp = 3  
        i = j;     // i = 5 
        j = temp;  // j = 3 

        //讓窗口停留 
        int age ; 
        scanf("%d",&age);

}

這樣就把值給換過來了,不過這樣做沒什麼意義,我們用函數去簡化他,我們先來看下用JAVA的概念值傳遞是一個什麼樣式

#include     
#include    

void function(int i ,int j)
     {
        int temp = i;  
        i = j;    
        j = temp;      
     }

main(){     
        //定義兩個變量 
        int i = 3;
        int j = 5;
        //調用函數
        function(i,j); 

        printf("i的值為:%d\n",i); 
        printf("j的值為:%d\n",j); 

        //讓窗口停留 
        int age ; 
        scanf("%d",&age);

}



用JAVA的思想,應該是這樣寫,我們來運行一下

這裡寫圖片描述

然而你會發現,他們的值沒有變化,這是因為在C中,值傳遞本身不會對變量產生什麼影響,其實在JAVA中這樣也不會發生什麼改變,左右這裡就牽扯出來一個引用傳遞了,我們寫一個JAVA程序來打比方

/**
 * 測試類
 * @author LGL
 *
 */
public class Test {
    //定義兩個全局變量
    int i = 3;
    int j = 5;

    public static void main(String[] args) {
        Test test = new Test();
        Function(test);
        System.out.println(test.i);
        System.out.println(test.j);
    }

    private static void Function(Test sTest){
        int temp = sTest.i;
        sTest.i = sTest.j;
        sTest.j = temp;
    }
}

用這個思想就可以把值轉換了

這裡寫圖片描述

這就叫引用傳遞,但是再C中面向過程的思想是沒有對象的,所以傳地址也是可以實現的,我們試試看<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxwcmUgY2xhc3M9"brush:java;"> #include #include void function(int* p ,int* q) { int temp = *p; *p = *q; *q = temp; } main(){ //定義兩個變量 int i = 3; int j = 5; //調用函數 function(&i,&j); printf("i的值為:%d\n",i); printf("j的值為:%d\n",j); //讓窗口停留 int age ; scanf("%d",&age); }

我們把內存地址傳過去之後,進行轉換,就可以了,運行如下

這裡寫圖片描述

值傳遞和引用傳遞的概念

值傳遞:傳遞一個普通的值 引用傳遞:傳遞一個內存地址

其實這些都應該叫值傳遞,只不過引用傳遞了一個地址罷了

四.指針返回值

為什麼使用指針?

指針是可以直接訪問硬件的 快速傳遞數據 返回一個以上的值 表示復雜的數據結構 方便處理字符串 指針有助於理解面向對象

要是讓我們用JAVA去寫一個返回值,大家都是用return,很方便,但是再C中,她是可以返回多個值的,我們寫個例子

#include     
#include    

void function(int* p , int* q)
     {  
        //進行操作 
        *p = *p*2;
        *q = *q *2;

     }

main(){     
        //定義兩個變量 
        int i = 3;
        int j = 5;
        //調用函數
        function(&i,&j); 

        printf("i的值為:%d\n",i); 
        printf("j的值為:%d\n",j); 

        //讓窗口停留 
        int age ; 
        scanf("%d",&age);

}



我們運行

這裡寫圖片描述

你會發現他變了,這就是C可以返回多個值的概念了,他都可用直接操作了

好的,這篇閒到這裡,走到這裡,對C已經有一個模糊的印象了,但是還沒有摸到門檻,我們還得繼續加油才是!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved