- java与C的简单比较
- 基本数据类型
- 指针及内存结构
- 数组
- 字符串
Pre:Hello world
#include<stdio.h>
int main(){
printf("Hello C World,I\'m coming.");
return 0;
}
一、java与C的简单比较
Android是基于Linux内核的,Linux是用C写的,所以C才是最根本的。而且,java虽说跨平台,但是丢失了对内存的最本质的控制,java简单易学,但是要追根溯源,还是要学习经典的C。下面是java与C中基本数据类型的对比:
- 1.java是跨平台,C与平台有关,但是C与底层交互性能好。
- 2.java是面向对象的,C是面向过程,思考方式不一样;
- 3.java没有指针的概念,内存管理靠GC机制;
二、基本数据类型
C语言共八种数据类型,与java对比如下:
- 1.C语言中char long 与java不同
- 2.c语言中没有java中的boolean byte。c语言中逻辑真假:非0为真,0为假
三、内存的特点
- 内存的最小存储单元,1byte = 8bits 1bit存储一位二进制数
- 内存单元的排列,一维线性连续排列,一个单元连一个单元
进程的可使用内存的大小:32位cpu,32操作系统,进程内存地址空间是4G,可使用内存范围
- 1KB = 1024 Bytes———————————2^10
- 1MB = 1024 KB = 1024 * 1024 Bytes————2^20
- 1GB = 1024 MB = 1024 * 1024 * 1024 Bytes—-2^30
- 4GB = 4*1GB = 4 * 1024* 1024 * 1024 Bytes—–2^32
操作系统通过给每个内存单元一个唯一的编号,编号是从0开始,连续编号,每个内存单元的编号可以作用内存单元的地址
32位与64位的区别
- 32位 有32根线,一个线两个状态,所以有2^32=4GB的大小,所以一个指针是4位的,这是32位只能用最大4GB内存
- 64位 64线,共有2^64个状态,已经到TB再往上两个级别了
四、指针
在C语言中把内存单元的地址称为指针,可以利用指针访问内存单元,指针有如下特点:
- 指针大小与平台相关,与数据类型没关系
- 变量按功能分为两类
- 普通变量 保存数值数据;(int p=3)
- 指针变量 专门保存变量的地址(内在单元的编号)(int *p)
1. 定义指针变量
定义指针变量:数据类型 \*指针变量名; 如,int *p;
- 指针的指向:指针变量保存了一个对应类型变量的首地址,称这个指针变量指向对应变量
- 指针变量p保存相应类型变量的首地址,p指向变量i,利用取对象运算符*访问指向的变量
//数据类型 *指针变量名
int * p = &i;//定义一个指针变量,*是类型的标志。 int * p int *p; p = &i;
p = &i;//&i获得变量的地址
printf("i = %d\n",i);
//*(&i) = 240;
*p = 240;//*取对象运算符 *p <=> i
//*p根据p保存的地址,访问地址对应变量的值
2. &和*用在指针上的区别
- &i &取地址运算符,获得变量对应空间的启始编号
- *(&i) *取对象运算符 根据&i内存单元编号,取变量的内存
- *(&i) <=> i
3. 指针常见错误
- 混用指针类型,什么类型变量用相应类型指针变量保存地址,可以类型强转
char a = 'k'; // char变量地址 char *
int b = 120; // int变量的址址 int *
//数据类型int 指针变量指向的对象类型
int *p;//保存int变量首地址
char *q;//保存char变量的地址
// p是int *指针变量 &a是char * 地址
p = &a;//指向int类型对象的指针变量不能指向char变量
q = (char *)&b;//临时强转
- 野指针 没有合法指向的指针变量
//指针访问内存之前需要指向合法申请的内存
// int *p;//野指针 不一定马上报错
int *p = NULL; //一定会报错
*p = 100;
printf("*p = %d\n",*p);
4. 指针的运算
- 指针的运算本质是地址运算。支持指针加减整数,相同类型指针相减
- 指针ptr加整数N ptr + N * sizeof(指向对象类型) 向高地址方向移动N个对象
- 指针ptr减整数N ptr - N * sizeof(指向对象类型) 向低地址方向移动N个对象
- 相同类型指针相减表示中间相差对象个数
5. 二级指针
指针可以指向另一个指针的地址,这样就形成了多级指针:
int i = 10;//定义一个普通变量保存数值数据
int *p = &i;//定义一个一级指针变量保存普通变量的地址
int **pp = &p;//定义一个二级指针变量保存一级指针变量地址
*p = 100; // *p <=> i
**pp = 1000; // **pp <=> *p <=> i
五、 数组
数组是相同数据类型变量的集合,元素在内存中相邻连续。数组名代表数组首元素首地址
定义数组方法:
- 数据类型 数组名[集合中元素个数要求确定的常数];
指针与数组关系
- 有个数组a,有个相应类型指针保存数组名a
- a[i] <=> (a + i) <=> (p + i) <=> p[i]
六、 字符串
c没有字符串类型,用字符数组char buf[5]保存字符串”123”,用字符指针char *p找到字符串
char buf[6] = "hello";//字符串保存时需要多一个字节保存结束标志'\0' char *p = buf;//p保存字符数组名 ,指向字符串第一个字符,因为结束标志,其实找到整个字符串
字符串处理#include