NDK入门篇:C语言基础

目录

写在前面

一、Linux内存布局原理

二、函数

2.1、函数定义

2.2、指针函数

2.3、函数指针

三、指针数组

3.1、数组

3.2、指针数组

3.3、数组指针(行指针)

四、结构体

4.1、结构体定义

4.2、内存对齐

五、共用体

六、动态库

6.1、库的概念

6.2、编译动态库


写在前面

前两天在看Android系统从开机到SystemServer进程以及服务创建这部分知识的时候,有很多C++的代码,所以就打算抽个一两天把C和C++这部分的东西稍微预习下😂,哈哈我都不敢说是复习,让自己能稍微看懂点。于是乎就有了本篇内容的诞生,遂将其放入了NDK专栏中,那么废话咱也不多说了,开搞!

一、Linux内存布局原理

①、内存定义

  • 硬件角度:内存是计算机必不可少的一个组成部分,是与CPU沟通的桥梁,计算机中所有的程序都是运行在内存中的。
  • 逻辑角度:内存是一块具备随机访问能力,支持读、写操作,用来存放程序及程序运行中产生的数据的区域。

②、内存单位

  • 位(bit):是计算机中最小的数据单位,每一位的状态只能是0或1
  • 字节:1Byte=8bit,是内存基本的计量单位
  • KB:1KB=1024Byte,也就是1024个字节
  • MB:1MB=1024KB,类似的还有GB、TB

③、内存编址

计算机中的内存按字节编址,每个地址的存储单元可以存放一个字节(8个bit)的数据,CPU通过内存地址获取指令和数据,并不关心这个地址所代表的空间具体在什么位置、怎么分布,因为硬件的设计保证一个地址对应着一个固定的空间,所以说:内存地址和地址指向的空间共同构成了一个内存单元。

④、内存地址及分配规则

  • 内存地址:内存地址通常用十六进制的数据表示,指向内存中某一块区域。
  • 内存地址分配规则:内存分配规则是连续的,一个挨着一个。当对象需要申请内存时,先给这个对象分配一个编码,这个编码就是内存地址

比如:上图就是一张内存地址的分布图,在每个字节中指向的都是一个对象,至于这个对象在哪里不用去管,我们需要知道的是这一系列的编码是连续性的。

⑤、内存对象

指针指向的内存区域存储的就是内存对象,内存对象可以是不同的类型,具体都有哪些类型呢?

  • Int:4字节
  • Short:2字节
  • long:4字节
  • char:1字节
  • double:8字节
  • long double:10字节
  • 引用类型

问题: C里面long类型为什么只有4个字节?

long和int在早期16位电脑的时候int 2个字节,long 4个字节,而计算机发展到现在,一般32位和64位机器下long和int一样。而Java中的long类型是8个字节

⑥、内存组成

首先来看Android的内存组成:

Android APP是基于虚拟机进行加载的,内存分配如上图所示,图中的内存都是在虚拟机中的,虚拟机是由C和C++进行开发的,这些内存脱离了虚拟机其实是不存在的。下面要说的C的内存分配是基于本地硬件环境的,相比于安卓内存要简单的多:

栈:栈又称堆栈,存放程序的局部变量(但不包括static声明的变量,static 意味着 在数据段中 存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。储动态内存分配,需要开发人员手工分配,手工释放

堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)

BSS段:通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已经初始化的全局变量的一块内存区域。数据段属于静态内存分配。 

代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数组成的。

二、函数

2.1、函数定义

函数和Java中的方法是一个概念,C是面向过程的,它的核心载体就是函数。

定义:函数是一组一起执行一个任务的语句。每个C程序都至少有一个函数,即主函数main(),所有简单的程序都可以定义其他额外的函数。

//返回值 函数名 参数列表
return_type function_name(parameter list){
    body of the function //函数体
}

举个最简单的例子:

#include <iostream>
//定义函数func,返回值类型为int,入参类型为void,意为无参数
int func(void) {
	printf("这是一个简单的函数"); //打印一句话
	return -1; //随便给它一个返回值
}
int main()
{
	func(); //在main函数中进行调用
}

结果很显然,正确打印出了一句话:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值