一些c/c++知识点

来源:互联网 发布:java框架书籍 编辑:程序博客网 时间:2024/06/06 10:00

1. 关于平printf输出问题:prinf计算参数时是从右往左压栈的。

示例:

int main(){        int a[] = {6,7,8,9,10} ;    int *p = a ;    (*p++) += 10 ;    printf("%d,%d",*p,*(++p)) ;   // cout<< *p << *(++p) << endl ;}

输出为:8,8 。

其中使用cout输出也是一样的。

2. define,const ,sizeof一些用法即特点。

在c程序中,const主要有:定义const常量,可以用来修饰函数的参数和返回值,在c++中可以修饰函数的定义体,被const

修饰的东西都受到强制保护,可以预防意外的变动,提高程序的健壮性。

#define和const的区别:c++语言用const定义常量,也可以使用#difine,但是前者比后者有更多的优点。

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型的安全检查,而对后者只进行字符的替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。

有些集成化调试工具可对const常量进行调试,但不能对宏常量进行调试,在c++程序中只使用const常量而不使用宏常量,即const变量完全取代宏常量。

sizeof和strlen的深入理解:

(1)sizeof操作符结果类型是size_t,它在头文件中的typedef为unsigned Int类型。该类型保证能容纳实现所建立的最大的对象的字节。

(2)sizeof是运算符,而时时strlen是函数。

(3)sizeof可以用类型做参数,strlen只能是char*做参数,而且必须一“\0”结尾的。sizeof还可以用函数做参数,返回函数返回值类型大小。

(4)数组做sizeof的参数不退化,传递给strlen就退化为指针。

(5)大部分编译程序在编译的时候就把sizeof计算过来,是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因。

(6)strlen的结果要在运行是才会计算出来,用来计算字符串的长度,而不是类型占内存的大小。

(7)sizeof后如果是类型必须家上括号,如果是变量的话可以加括号。这是应为sizeof是运算符而不是函数。

(8)当使用了一个结构类型或变量时,sizeof返回实际值的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回被动态分配的数组或是外部的数组的尺寸。

3.内联函数和宏定义的差别

内联函数和普通函数相比可以加快程序的运行速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。而宏只是简单的替换。

内联函数要做参数的类型检查,这是内联函数跟宏比的优势。

inline是指嵌入代码,就是在调用函数的地方直接写到那里去而不是跳转,对于短小代码来说,inline可以带来一定的效率提升,而且和c时代的宏相比,inline跟安全可靠。可是这个是增加空间消耗为代价的,至于需不需要用inline函数,这就要根据实际情况来取舍。

(1)一个函数不断被重复调用。

(2)函数只用简单的几行,且函数内不包含for while switch语句。

内存对齐

各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节自动填充。同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。 

原创粉丝点击