1. 程式人生 > >Android JNI程式設計(六)——C語言函式指標、Unition聯合體、列舉、Typedef別名、結構體、結構體指標

Android JNI程式設計(六)——C語言函式指標、Unition聯合體、列舉、Typedef別名、結構體、結構體指標

一:函式指標

1.函式指標顧名思義就是定義一個指標變數指向一個函式,和一級指標並沒有很大的區別我們看如下程式碼就很清楚的知道了

#include<stdio.h>
#include<stdlib.h>

//定義一個函式
int add(int a,int b) {
    return a + b;
}
main() {
    //定義函式指標
    //返回值型別,變數名可以隨便取,函式沒有方法體
    int (*point)(int a,int b);
    //給函式指標賦值
    point = add;
    //使用函式指標
    int result= point(12
,5); printf("result=%d\n",result); system("pause"); }

輸出的結果就是12+5=17;可以理解為把add函式的地址賦值給point,所以呼叫add和point是一樣的效果。

二:Unition聯合體

1.定義一個聯合體並對其中的變數進行賦值

#include<stdio.h>
#include<stdlib.h>

//定一個聯合體,
union Mix {
    long i;//4個位元組
    int k;//4個位元組
};

main() {
    printf("mix長度=%d\n"
,sizeof(union Mix)); union Mix m; m.k=100; m.k=123; printf("m.i=%d\n",m.i); printf("m.k=%d\n",m.k); system("pause"); }

這裡寫圖片描述

2.上面的程式中我們只改變了k的值,但是從結果可以看出i的值也跟著變了,這就要說說Unition聯合體的特點了:

  • 特點:所有的欄位都是使用同一塊記憶體空間
  • 應用場景:各個型別之間方便轉換

三:列舉就很簡單了 關鍵字:“enum”

#include<stdio.h>
#include<stdlib.h>
/**
    列舉的值是遞增的,首元素預設等於0 
 */
enum WeekDay { Monday=1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday }; main() { //enum WeekDay day= Sunday; printf("%d\n",Sunday); system("pause"); }

這裡寫圖片描述

四:Typedef別名,理解起來so easy

別名:字面意思就是給一個東西取另外一個名字來代替它;就好比如你的好朋友給你取的外號,這樣就好理解了。

#include<stdio.h>
#include<stdlib.h>

typedef int i;//給int型別取了個別名叫i
typedef long l;//給long型別取了個別名叫l

main() {
    //這裡i就代表了int型別 
    i a=10;
    //l就代表了long型別 
    l b=1234355466;
    printf("a=%d\n",a);
    printf("b=%ld\n",b);
    system("pause");
}

五:結構體

C語言中的結構體類似於Java中的實體類,我們通過對比C程式碼與Java程式碼就可以看出。

1.C語言中定義一個結構體 關鍵字:“struct”

#include<stdio.h>
#include<stdlib.h>

struct Student {
    int age;//年齡
    float score;//分數
    char sex;//性別
};
main() {
    //使用結構體,並對變數進行初始化
    struct Student stu= {18,90.9,'W'};
    printf("age=%d\n",stu.age);
    printf("score=%.1f\n",stu.score);
    printf("sex=%c\n",stu.sex);

    //結構體賦值
    stu.age=20;
    stu.score=100;
    stu.sex='M';

    printf("age=%d\n",stu.age);
    printf("score=%.1f\n",stu.score);
    printf("sex=%c\n",stu.sex);

};

這裡寫圖片描述

用Java的方式來說上面程式碼就是:定義了一個Student實體類(結構體),並宣告三個成員變數(age, score,sex);使用結構體的時候為變數進行初始化。

2.我們來通過Java程式碼來實現上述程式一樣的效果,這樣你就可以很好的理解上面所講的結構體了。

class Student {
    public int age;// 年齡
    public float score;// 分數
    public char sex;// 性別

    public Student(int age, float score, char sex) {
        this.age = age;
        this.score = score;
        this.sex = sex;
    }
}

public class Test {
    public static void main(String[] args) {
        Student student = new Student(18, 90.9f, 'W');

        System.out.println(student.age);
        System.out.println(student.score);
        System.out.println(student.sex);

        student.age = 20;
        student.score = 100;
        student.sex = 'M';

        System.out.println(student.age);
        System.out.println(student.score);
        System.out.println(student.sex);
    }
}

五:結構體指標和多級結構體指標

1.使用一級結構體指標

#include<stdio.h>
#include<stdlib.h>

struct Student {
    int age;//年齡
    float score;//分數
    char sex;//性別
};
main() {
    //使用結構體
    struct Student stu= {18,90.9,'W'};
    //結構體指標
    struct Student* point = &stu;

    //結構體指標取值,(*point)取得是結構體
    printf("(*point).age=%d\n",(*point).age);
    //(*point).age等價於point->age;
    printf("point->age=%d\n",point->age);
    printf("point->score=%.1f\n",point->score);
    printf("point->sex=%c\n",point->sex);

    //結構體賦值
    point->age=22;
    printf("修改後age=%d\n",point->age);
};

這裡寫圖片描述

結構體指標取值我們可以通過:student.age或者(*point).age又或者point->age 用“->”可以簡化程式碼的書寫就像Java8所支援的Lambda表示式一樣使程式碼更加簡潔。

2.使用二級結構體指標或者多級結構體指標

#include<stdio.h>
#include<stdlib.h>

struct Student {
    int age;//年齡
    float score;//分數
    char sex;//性別
};
main() {
    //使用結構體
    struct Student stu= {18,90.9,'W'};
    //結構體指標
    struct Student* point = &stu;
    //二級結構體指標
    struct Student** point2 = &point;

    //二級結構體取值
    //(**point2).age也等價於(*point2)->age
    printf("(**point2).age=%d\n",(**point2).age);
    printf("*point2->age=%d\n",(*point2)->age);
    //二級指標賦值
    (*point2)->age=25;
    printf("*point2->age=%d\n",(*point2)->age);
}

這裡寫圖片描述

從上面我們可以看出一級結構體指標(*point).age==point->age;二級結構體指標(**point2).age==(*point2)->age。也就是說“->”代表了一個等級的指標。

這幾天總算是把C語言的一些基本內容學了一遍,為的就是接下來的JNI開發,所以接下來就來一起學習JNI開發吧!

這裡寫圖片描述