不然你要我怎么样

彪悍的代码不需要注释

Archive for the ‘C’ tag

【转贴】sizeof(结构体)和内存对齐

leave a comment

(一)

有的时候,在脑海中停顿了很久的“显而易见”的东西,其实根本上就是错误的。就拿下面的问题来看:


struct T
{
char ch;
int i ;
};

使用sizeof(T),将得到什么样的答案呢?要是以前,想都不用想,在32位机中,int是4个字节,char是1个字节,所以T一共是5个字节。实践出真知,在VC6中测试了下,答案确实8个字节。哎,反正受伤的总是我,我已经有点麻木了,还是老老实实的接受吧!为什么答案和自己想象的有出入呢?这里将引入内存对齐这个概念。 Read the rest of this entry »

转载请注明: 转载自不然你要我怎么样
本文链接地址: 【转贴】sizeof(结构体)和内存对齐

Written by xiangmocheng

三月 2nd, 2009 at 2:04 下午

Posted in Embedded

Tagged with

C语言声明之const

leave a comment

关键字const

用法:

1.可以定义 const 常量

2.const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

const意味着”只读”。区别如下代码的功能非常重要。

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

前两个作用是一样的,a是一个常整型数。

第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

第四个意思是a是一个指向整型数的常指针(也就是,指针指向的整型数是可以修改的,但指针是不可修改的)。

最后一个意味着a是一个指向常整型数的常指针(也就是,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于”输入参数”。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,清晰的辨别哪些是输入参数,哪些是可能的输出参数。

合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。

const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:”只能读的普通变量”,可以称其为”不能改变的变量”(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以#define宏定义!故在C语言中如下程序是非法的:

const int SIZE = 10;
char a[SIZE]; /* 非法:编译阶段不能用到变量 */

以下是工作中的使用const例子:

const unsigned char * pbyData;
unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } ;
extern void dp_write_dsp_block ( const word *bp, word len );
const unsigned short InterMapSparseIdx[];

转载请注明: 转载自不然你要我怎么样
本文链接地址: C语言声明之const

Written by xiangmocheng

十二月 22nd, 2008 at 3:21 下午

Posted in Embedded

Tagged with ,

C语言声明之static

leave a comment

手边有书,心中无书。实在是厌烦了去查书,so,好好总结下。

—————————————————————

关键字static:

关键字static是一个存储类说明符,同extern,typedef一样,因此他们不能同时使用。

定义:说明符static将声明的对象说明为静态存储类

在C语言中,关键字static有三个明显的作用:

1.static用于声明内部变量

在函数体内,一个被声明为static的变量在这一函数被调用过程中仅分配一次内存,且函数结束后其不会被销毁。

e.g.:

#include<stdio.h>
int TestStatic()
{
    static int x=1;
    x++;
    return x;
}
void main()
{
    int i;
    for(i=0;i<5;i++)
        printf(“%d\n, TestStatic());
}

输出为:
2
3
4
5
6

2.static用于声明外部变量

在模块内(但在函数体外),一个被声明为static的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量(最常见的用法)。

3.static用于声明函数

在模块内,一个被声明为static的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

转载请注明: 转载自不然你要我怎么样
本文链接地址: C语言声明之static

Written by xiangmocheng

十二月 22nd, 2008 at 12:12 下午

Posted in Embedded

Tagged with ,