C语言基础(一)

  • 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值