博文

2007\05\22(2007-05-22 23:28:00)

摘要:1、C语言引入了"可修改的左值"这个术语。它表示左值允许出现在附值语句的左边。这个术语是为了与数组名区分,数组名也用于确定对象在内存中的位置,也是左值,但它不能作为赋值的对象。因此,数组名是个左值但不是可修改的左值。标准规定赋值符必须用可修改的左值作为它左边一侧的操作数。通俗的说,只能给可以修改的东西赋值!
2、编译器为每个变量分配一个地址(左值)。这个地址在编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知/如果需要用到变量中存储的值,编译器就发出指令从指定地址读如变量值并将它存于寄存器中。
3、  定义数组时,是从编译器符号表中取的数组名的地址然后加上数组下标(偏移量)来进行访问地址中的内容的。
     对于指针,编译器首先从符号列表中取的这个指针变量的地址,然后再取得该地址中存储的地址,再通过这个地址进行访问。
>>数组和指针的其他区别:
   指针:  保存数据的地址     间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。如果 指针有一个下标[i],就把指针的内容加上i作为地址,从中提出数据。     通常用于动态数据结构     相关的函数为malloc(),free()   通常指向匿名数据    数组:  保存数据           直接访问数据,a[i]只是简单地以a+i为地址取得数据     通常用于存储固定的树木且数据类型相同的元素      隐式分配和删除      自身即为数据名    定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋值给指针一个字符串常量进行初始化。(注......

阅读全文(1794) | 评论:0

2007\05\19(2007-05-19 23:21:00)

摘要:3.8  理解所有分析过程的代码段
    编写一个程序,把C语言的声明翻译成通俗的语言:
      主要的数据结构是一个stack,我们从左向右读取,把各个标记依次压入stack,直到读到标示符为止。然后我们继续向右读入一个标记,也就是标示符右边的那个标记。接着,观察标示符左边的那个标记(需要从stack中弹出)。
      数据结构大致如下:
          struct token{
                      char type;
                      char string[MAXTOKENLEN];}
      /* 保存第一个标示符之前的所有标记 */
       struct token stack[MAXTOKENS];
      /* 保存刚读入的那个标记 */
       struct token this;
     伪代码如下:
     实用程序---------
     classify_string(字符串分类)
 ......

阅读全文(1952) | 评论:0

2007\05\18(2007-05-19 00:43:00)

摘要:1、函数返回值不能是一个函数,所以箱foo()()这样是非法的。
2、函数的返回值不能是一个数组,所以想foo()[]这样是非法的。
3、数组里面不能有函数,所以像foo()[]这样是非法的。
但下面这样则是合法的:
1、函数的返回值允许是一个函数指针,如:int(*fun())();
2、函数的返回值允许是一个指向数组的指针,如:int(*foo())[];
3、数组里面允许有函数指针,如int (*foo[])();
4、数组里面允许有其他数组,所以你经常能看到 intfoo[][]; ~结构体中也可以存在位段、无名字段以及字对齐所需的填充字段。这些都是通过在字段的声明后面加一个冒号以及一个表示字段位长的整数来实现的。如:
      /* 处理ID信息 */
     
      struct pid_tag{
              unsigned int inactive : 1;
              unsigned int          : 1;   /* 1个位的填充 */                  
              unsigned int rescount : 6;
   ......

阅读全文(1895) | 评论:0

[ZJ]C语言中volatile关键字(2007-05-19 00:08:00)

摘要:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
     1). 并行设备的硬件寄存器(如:状态寄存器)
     2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
     3). 多线程应用中被几个任务共享的变量
     回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
     假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
     1). 一个参数既可以是const还可以是volatile吗?解释为什么。
     2). 一个指针可以是volatile 吗?解释为什么。
     3). 下面的函数有什么错误:
          int square(volatile int *ptr)
          {
               return *ptr * *ptr;
   &nbs......

阅读全文(2111) | 评论:0