2016.07.10学习内容

07.10学习内容:C语言
一.概述
1.嵌入式为什么选择用C语言:因为内核使用C语言编写的
2.内核为什么用C语言实现:因为C语言的以下三个特点
a.出色的可移植性,适用于不同的软硬件平台。(移植性越好,修改的地方就越少)
b.简洁紧凑,使用灵活的语法机制,并能直接访问硬件。(内核管理软硬件资源,所以就要使用C语言)
c.运行效率高
3.为什么不用汇编语言:(嵌入式中如何选择C语言和汇编)
汇编语言访问硬件效率比C语言高,但是汇编语言是低级语言,不适合写复杂的内核(功能),而C语言是一个高级语言,可以对硬件做复杂操作。C语言中可以内嵌汇编语言,用以对软件初始化
4.Java效率低,需要解释性语言,而C语言翻译成机器码直接读取
5.c与c++
c面向结构(过程),c++面向对象(效果)
面向过程处理机制VS面向对象处理机制:
举例,从A到B,面向结构:规划路线;面向对象:打车,告诉去B,其他不用管
6.思考:C语言能否实现面向对象的处理机制
写成函数,进行调用,复用
7.C语言之父:丹尼斯*里奇,《C程序设计语言》
8.C语言标准:
a.K&RC
b.ANSIC/C89标准(C89即C90)编译器支持的标准,按照标准编程(如gcc默认C90)
c.gcc部分兼容C99
d.c11标准,IOS支持
二.数据类型
1.bit位,内存最小单位
字节=8位
半字=2个字节=16位
字=4个字节=32位
2.一个变量的大小用字节衡量
sizeof测量变量字节大小,是一个运算符,不是函数
char--1字节
short--2字节
int--4字节
long--4字节
float--4字节
double--8字节
用sizeof编程测量各变量的大小,见图1
测量int*大小就是4字节,任何类型的指针长度都是4字节。原因:指针式用来保存地址的,而地址的长度是固定的,是有操作系统的决定的,操作系统是32位就是4字节,64位就是8字节
3.某公司笔试题目:
int main()
{
   char a[1000];
   int i;
   for(i=0;i<1000;i++)
   {
      a[i]=-1-i;
    }
   printf("%d\n",strlen(a));
   return 0;
}
输出结果?
解析:255
char一个字节,8位,取值范围:无符号0~255,有符号-128~127
strlen函数是用来计算字符串长度的,并不包含字符串最后的\0,而判断字符串是否结束的标志就是看是否遇到\0,如果遇到\0,则本字符串结束。
在计算机系统中,数值一律用补码表示,减法用加法来处理






3.变量声明


“右左法则”
这是一个简单的法则,但能让你准确理解所有的声明。这个法则运用如下:从最内部的括号开始阅读声明,向右看,然后向左看。当你碰到一个括号时就调转阅读的方向。括号内的所有内容都分析完毕就跳出括号的范围。这样继续,直到整个声明都被分析完毕。  


对上述“右左法则”做一个小小的修正:当你第一次开始阅读声明的时候,你必须从变量名开始,而不是从最内部的括号。  
1.int * (* (*fp1) (int) ) [10];  


阅读步骤:  
1. 从变量名开始 -------------------------------------------- fp1 变量 
2. 往右看,什么也没有,碰到了),因此往左看,碰到一个* ------ 一个指针  
3. 跳出括号,碰到了(int) ----------------------------------- 一个带一个int参数的函数  
4. 向左看,发现一个* --------------------------------------- (函数)返回一个指针  
5. 跳出括号,向右看,碰到[10] ------------------------------ 一个10元素的数组  
6. 向左看,发现一个* --------------------------------------- 指针  
7. 向左看,发现int ----------------------------------------- int类型  
总结:fp1是一个函数指针变量,该函数指针指向一个形参为int返回值为数组指针的函数,该数组指针指向一个整型指针数组
再来看一个例子:  


2.int *( *( *arr[5])())();  


阅读步骤:  
1. 从变量名开始 -------------------------------------------- arr  
2. 往右看,发现是一个数组 ---------------------------------- 一个5元素的数组  
3. 向左看,发现一个* --------------------------------------- 指针  
4. 跳出括号,向右看,发现() -------------------------------- 不带参数的函数  
5. 向左看,碰到* ------------------------------------------- (函数)返回一个指针  
6. 跳出括号,向右发现() ------------------------------------ 不带参数的函数  
7. 向左,发现* --------------------------------------------- (函数)返回一个指针  
8. 继续向左,发现int --------------------------------------- int类型  


arr是一个函数指针数组,数组元素指向一个形参为空返回值为函数指针的函数,该函数指针指向一个形参为空返回值为整型指针的函数。
 
3. void *(*c)(char,int(*)())
c右边--)变量,左看——*指针
右--函数,形参为char,int(*)(),返回值为void *
4.float (*(*e[10])(int*))[5];
e右--数组
左看--指针
右看--函数,形参为int,返回值为指针(左看),
右看--数组
左看--float
总结:c是一个函数指针数组,该函数指针指向一个形参为int返回值为数组指针(的函数),该数组指针指向浮点型


4.用变量a给出下面的定义:
a.一个整型数
b.一个指向整型数的指针
c.一个指向指针的指针,它指向的指针是指向一个整型数
d.一个有10个整型数的数组
e.一个有10个指针的数组,该指针是指向一个整型数的
f.一个指向有10个整型数组的指针
g.一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h.一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答:
a.int a;
b.int *a;
c.int **a;
d.int a[10];
e.int *a[10];
f.int (*a)[10];
g.int (*a)(int);
h.int (*a[10])(int);
反过来用左右法则理解声明:
a.整型变量
b.整型指针变量
c.整型指针指针变量
d.整型数组
e.整型指针数组
f.整型数组指针变量
g.函数指针变量
h.函数指针数组


确定它是什么(A),它保存什么(B),就是BA,如指针数组




三.变量与常量
1.变量的三大特点:
a.变量的数据类型:说明变量占用内存空间大小,如int型占4字节
b.变量的作用域:变量的有效性范围,即变量的使用范围
c.变量的存储类型:变量在内存中的存储方式。不同的存储方式影响变量在内存中的生存周期
2.进程:一个程序一旦运行就变成一个进程
进程的活动空间叫做进程的虚拟地址空间,大小为4G(不让进程直接使用物理内存,解决内存资源稀缺
这个过程用MMU做映射,4G在物理内存(实际内存)上映射2M,按程序进入这2M空间
打印地址打印的是虚拟内存地址
3.空间划分                     
a.高地址1G空间给内核,3G用户访问
b.3G又分为栈空间,堆空间,数据段,代码段
栈空间--局部变量,函数形参,自动变量
堆空间--malloc,ralloc,calloc
数据段--bss段(保存未初始化的全局变量),rodata段(各常量,不能被修改),data段(静态数据区)--全局变量,static(修饰变量)
4.栈空间:先进后出,管理权限在系统,执行完释放。
         存放局部变量,不赋值就随机赋值
堆空间:先进先出,管理权限在客户,程序结束后再释放
        无初始化默认为0
5.内存分配方式有哪些:在栈空间,堆空间,数据段,代码段分配
6.解释int num=5;——考的就是全局变量与局部变量的区别
7.声明和定义
定义:创建一个变量,为其分配内存空间,并为它取名字(变量名),一个变量只能定义一次;
声明:告知编译器,这个名字(变量名)已经匹配在一块内存上了,但是并未为其分配内存
变量的声明有两种情况:定义性声明--需要建立存储空间。例如int a在声明的时候就已经就已经建立了存储空间。
引用性声明:不需要建立存储空间。例如exterm int a,其中变量a是在别的文件中定义的  
8.sizeof预算符长度
例如:ptr[]="hello world"
sizeof测量长度为12,strlen测量长度为11,字符串最后是\0,strlen不计算\0
                                 









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值