版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/。

目录(?)[+]

一:函数指针

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开发吧!

Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针的更多相关文章

  1. Android jni 编程4(对基本类型二维整型数组的操作)

    Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...

  2. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  3. Android JNI编程(一)——JNI概念以及C语言Dev-C++开发环境搭建、编写HelloWorld

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:JNI是什么呢? JNI:JNI是JavaNative Interfac ...

  4. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  5. Android jni 编程3(对基本类型一维整型数组的操作)总结版

    主要学习资料:黑马程序员的NDK方法使用(生产类库so)              jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...

  6. Android jni 编程入门

    本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...

  7. 【转】android JNI编程 一些技巧(整理)

    原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...

  8. Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针. ...

  9. Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针. 1 ...

随机推荐

  1. 7.Maven之(七)pom.xml配置文件详解

    转自:https://blog.csdn.net/qq_33363618/article/details/79438044 setting.xml主要用于配置maven的运行环境等一系列通用的属性,是 ...

  2. 3/18 Django框架 启动django服务

    web框架:本质是socket服务端,socket通常也被称为"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信.web框架就是将 ...

  3. Apple Watch 集成环信SDK

    本文简单的讲述下怎样用Apple Watch Kit集成环信SDK. 升级xcode到version 6.2,和 IOS SDK8.2 下载环信SDK从官网 打开XCode->new proje ...

  4. 逆波兰法(计算器)程序<无括号版>

    涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(), ...

  5. hdu5384 AC自己主动机模板题,统计模式串在给定串中出现的个数

    http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franc ...

  6. Android Studio - no debuggable applications 的解决的方法

    之前logcat总是无法显示调试应用的信息 曾经我都是卸载重装.后来发如今StackOverflow有一个哥们说的非常对.一次就成功. 原话是这么说的: You also should have To ...

  7. 【例题 6-17 UVa 10562】Undraw the Trees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟+递归 [代码] #include <bits/stdc++.h> using namespace std; con ...

  8. thinkphp5最最最最简单的ajax实例

    thinkphp5最最最最简单的ajax实例 一.总结 一句话总结:页面端使用$.get()方法传递ajax请求,服务器端判断是不是ajax请求,是的话接受参数,进行逻辑处理之后向客户端返回值. 1. ...

  9. NVL与NVL2

      一.NVL函数是一个空值转换函数   NVL(表达式1,表达式2)   如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值. 该函数的目的是把一个空值(null)转换成一个实际的 ...

  10. axios采坑之路

    POST请求设置Content-Type 由于后端采用的是form表单形式上送参数,需要设置Content-Type axios设置如下 const _axios = axios.create(con ...