Android JNI程式設計(六)——C語言函式指標、Unition聯合體、列舉、Typedef別名、結構體、結構體指標
阿新 • • 發佈:2019-01-01
一:函式指標
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。也就是說“->”代表了一個等級的指標。