C嵌入式

1   如何     C 中初始化一个字符数组。
这个问题看似很简单,但    是我们要将最简单    的问题用最严谨    的态度来对待。关键    的地方:初始化、字符型、数组。最简单    的方法     char array[]; 。这个问题看似解决了,但       在初始化上好像还欠缺点什么,个人认为: char array[5]={'1','2','3','4','5'}; 或者 char array[5]={"12345"}; 或者 char array[2][10]={"China","Beijing"}; 也许更符合 初始化 ”   的意思。
2
  如何     C 中为一个数组分配空间。
最简单    的方法    是: char array[5] ;意思    是分配给数组 array 一个 5 个字节    的空间。但    是我们要知道     C 中数组其实就    是一个名字,其实质含义就    是指针,比如 char array[]    是到底分配    的多少空间?所以我们要将其分成为两种不同    的形式给出答案:
一种    是栈    的形式: char array[5]
一种    是堆    的形式: char *array; array=(char *)malloc(5);//C++: array=new char[5];
堆和栈    的含义其实我也没弄太透彻,改天明白了再发一篇。
我们要明白       是,第一种形式空间分配    的大小可能会受操作系统    的限制 , 比如 windows 会限制     2M ;第二种形式成空间分配很灵活,想分配多少分配多少,只要 RAM 够大。
3
  如何初始化一个指针数组。
首先明确一个概念,就    是指向数组    的指针,和存放指针    的数组。
指向数组    的指针: char (*array)[5]; 含义    是一个指向存放 5 个字符    的数组    的指针。
存放指针    的数组: char *array[5]; 含义    是一个数组中存放了 5 个指向字符型数据    的指针。
按照题意,我理解为初始化一个存放指针    的数组, char *array[2]={"China","Beijing"} ;其含义    是初始化了一个有两个指向字符型数据    的指针    的数组,这两个指针分别指向字符串 "China" "Beijing"
4
、如何定义一个有 10 个元素    的整数型指针数组。
既然只    是定义而不    是初始化,那就很简单且没有争议了: int *array[10];
5
 s[10]   的另外一种表达方式    是什么。
前面说过了,数组和指针其实    是数据存    在形态    的两种表现形式,如果说对于数组 s[] ,我们知道 *s=s[0] ,那么 s[10]   的另一种表达方式就    是: *(s+10)
6
 GCC3.2.2 版本中支持哪几种编程语言。
这个问题实    在变态,就像问你 #error   的作用    是什么一样。不可否认, gcc    linux 下一个亮点,    是一个备受无数程序员推崇    的编译器,其优点省略 1000 字,有兴趣可以自己查,我翻了翻书,书上曰:支持 C,C++,Java,Obj-C,Ada,Fortran,Pascal,Modula-3 等语言,这个 比较要命,不过我认为已经很全了,如果认为还    是不全,干脆把 ASM 也加上算了,不过那已经不算    是编译了。
7
  要使用 CHAR_BIT 需要包含哪个头文件。
如果结合上面    的问题,答题    的人估计会认为自己撞鬼了,这个问题实        …… 搜索了一下,应该     limits.h
8
  (-1.2345) 取整    是多少?
其实不同    的取整函数可能有不同    的结果,不过这个数没有太大    的争议,答案     -1
9
  如何让局部变量具有全局生命期。
具体    的生命期    的概念我觉得我还要好好深入    的学习一下,但    是这个题目还算比较简单,即用 static 修饰就可以了,但    是只    是生命期延长,范围并没有扩大,除非把这个变量定义    在函数体外    的静态区,不过那样就变成全局变量了,仿佛不符合题目要求。
10
C    的常量字符串应    在何时定义?
这个问题说实话不    是很理解题干    的意思,据我理解,有两种情况,一种    是预处理阶段,用 #define 定义;还有就    是使用 const 修饰词,不过 const 修饰       是一个变量,其含义     “ 只读 ,称之为常量并不准确,但    是确实可以用操作变量    的方法当常量用。所以还    是第一种比较靠谱。
11
、如何    在两个 .c 文件中引用对方    的变量。
这个问题也问    的挺含糊    的,怎么说呢,最简单最直接    的方法    是为变量添加 extern 修饰词,当然,这个变量必须    是全局变量。还有一种就    是利用函数调用来进行变量    的间接引用,比如这个 C 文件中    的一个函数引用另外一个 C    的函数,将变量通过实参    的形式传递过去。不过题目既然说    是引用,那么还    是用第一个答案好了。
12
、使用 malloc 之前需要做什么准备工作。
其实准备工作很多啊,比如你需要一台计算机之类    的。玩笑话,我们首先要知道 malloc   的用途,简单    的说就    是动态    的分配一段空间,返回这段空间    的头指针。实际    的准备工作可以这么分:需要这段空间    的指针    是否存    在,若不存    在,则定义一个指针用来被赋值,还要清楚要返回一个什么类型    的指针,分配    的空间   是否合理;如果指针已经存    在,那么    在重新将新    的空间头地址赋值给这个指针之前,要先判断指针    是否为 NULL ,如果不    是要 free 一下,否则原来    的空间就会被浪费,或者出错, free 之后就按照前一种情形考虑就可以了。
13
realloc 函数    在使用上要注意什么问题。
这个函数我也才知道    的,汗一个。据我    的初步理解,这个函数    的作用    是重新分配空间大小,返回    的头指针不变,只    是改变空间大小。既然    是改变,就有变大、变小和为什么改变    的问题。变大,要注意不能大到内存溢出;变小,那变小    的那部分空间会被征用,原有数据不再存    在;为什么改变,如果    是想重新挪作他用,还    是先 free 了吧。
14
strtok 函数    在使用上要注意什么问题。
这个问题我不知道能不能回答全面,因为实       是用    的很少。这个函数    的作用    是分割字符串,但    是要分割    的字符串不能    是常量,这    是要注意    的。比如先定义一个字符串: char array[]="part1,part2"; strtok   的原形     char *strtok(char *string, char *delim); ,我们将 "," 作为分隔符,先用 pt=strtok(array,","); ,得到    的结果 print 出来就     "part1" ,那后面    的呢,要写成 pt=strtok(NULL,","); ,注意,要用 NULL ,如果被分割    的字符串会被分成 N 段,那从第二次开始就一直要用 NULL 。总结起来,需要注意       是:被分割    的字符串和分隔符都要使用变量;除第一次使用指向字符串    的指针外,之后    的都要使用 NULL ;注意使用这个函数    的时候千万别把指针跟丢了,不然就全乱了。
15
gets 函数    在使用上要注意什么问题。
   是一个键盘输入函数,将输入字符串    的头地址返回。说到要注意    的问题,我还    是先查了一下网上    的一些情况,需要注意    的就     gets 以输入回车结束,这个地球人都知道,但    是很多人不知道       是,当你输入完一个字符串后,这个字符串可能依然存    在于这个标准输入流之中,当再次使用 gets   的时候,也许会把上次输入    的东西读出来,所以应该    在使用之后用 fflush(stdin); 处理一下,将输入流清空。最后也还    是要注意溢出    的问题。关于这个答案我比较含糊,不知道有没有高人高见?
16
C 语言    的词法分析    在长度规则方面采用       是什么策略?
我无语 …… 闻所未闻啊 ……    是搜索了一下,有一篇文章,地址    是:
http://202.117.80.9/jp2005/20/kcwz/wlkc/wlkc/03/3_5_2.htm
   是关于词法分析器    的。其中提到了两点策略:  (1)  按最长匹配原则确定被选    的词型; (2)  如果一个字符串能为若干个词型匹配,则排列    在最前面    的词型被选中。不知道    是不    是题干    的要求,还    是其他什么。我乃一介草民,望达人指点迷津!
17
a+++++b 所表示       是什么意思?有什么问题?
这个东西(称之为东西一点都不过分)其实并没有语法错误,按照 C 对运算符等级    的划分, ++   的优先级大于 + ,那么这句话会被编译器看做: (a++)+(++b) ,这回明白了吧。有什么问题,语法上没有问题,有       是道德上    的问题!作为一个优秀    的程序员,我们要力求语句    的合法性和可读性,如果写这句    的人       在一个 team 里,那么他基本会被打    的半死 …… 最后讨论一下结果:假设 a 之前    的值     3 b    4 ,那么运行完这个变态语句后, a   的值     4 b    5 ,语句    的结果    8
18
、如何定义 Bool 变量     TRUE FALSE   的值。
不知道这个题有什么陷阱,写到现    在神经已经大了,一般来说先要把 TURE FALSE 给定义了,使用 #define 就可以:
#define TURE 1
#define FALSE 0
如果有一个变量需要定义成 bool    的,举个例子: bool a=TURE; 就可以了。
19
C 语言     const   的含义    是什么。    在定义常量时,为什么推荐使用 const ,而不     #define
首先,这个题干抽了 10 题回答    的一个大嘴巴。关于常量    的概念看来我要好好看看书了 …… 我说过了, const 修饰词可以将一个变量修饰为 只读 ,这个就能称为常量么?姑且认为可以。回到题目中, const   是只读    的意思,它限定一个变量不允许被改变,谁都不能改!既然    是修饰变量,那么变量    的类型就可以丰富多彩, int 啊, char 啊,只要 C 认识    的都可以;但     #define 就不可以了,    在预处理阶段缺乏类型检测机制,有可能会出错。还有就    是变量可以 extern ,但     #define 就不可以。貌似 const 还可以节省 RAM ,这个我倒    是没有考证过。至于 const   的用法和作用,有很多,我会总结后发上来。
20
C 语言     volatile   的含义    是什么。使用时会对编译器有什么暗示。
终于最后一题了,容易么 …… 如果这个测试    是一个关于嵌入式    的,那么这道题非常重要!!从词面上讲, volatile   的意思    是易变    的,也就    是说,    在程序运行过程中,有一些变量可能会被莫名其妙    的改变,而优化器为了节约时间,有时候不会重读这个变量    的真实值,而    是去读    在寄存器    的备份,这样    的话,这个变量   的真实值反而被优化器给 优化 掉了,用时髦    的词说就    是被 和谐 了。如果使用了这个修饰词,就    是通知编译器别犯懒,老老实实去重新读一遍!可能我说    的太 通俗 了,那么我引用一下 大师 ”   的标准解释:
volatile  
的本意     “ 易变     ” 
由于访问寄存器    的速度要快过 RAM, 所以编译器一般都会作减少存取外部 RAM   的优化,但有可能会读脏数据。当要求使用 volatile  声明    的变量    的值    的时候,系统总    是重新从它所       的内存读取数据,即使它前面    的指令刚刚从该处读取过数据。而且读取    的数据立刻被保存。
精确地说就    是,优化器    在用到这个变量时必须每次都小心地重新读取这个变量    的值,而不    是使用保存    在寄存器里    的备份。
下面     volatile 变量    的几个例子:
1). 
并行设备    的硬件寄存器(如:状态寄存器)
2). 
一个中断服务子程序中会访问到    的非自动变量 (Non-automatic variables)
3). 
多线程应用中被几个任务共享    的变量
嵌入式系统程序员经常同硬件、中断、 RTOS 等等打交道,所用这些都要求 volatile 变量。不懂得 volatile 内容将会带来灾难。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值