20140319 const sizeof define 编译时分配内存

1、面试宝典预处理,const,sizeof

  • Define作用定义函数:

 

//用一个宏定义FIND求一个结构体struc里某个变量相对于struc的偏移量,如FIND(student,a)//等于0 FIND(student,b)//等于4
#include<stdio.h>
#define FIND(strucrr,e) (unsigned int)&(((strucrr *)0)->e)
struct student
{
    double ccc;
    int a;
    char b;
};

int main()
{    
    struct student  A;
    printf("ccc的偏移地址为:%d\n",FIND(student,ccc));
    printf("a的偏移地址为:%d\n",FIND(student,a));
    printf("b的偏移地址为:%d\n",FIND(student,b));
    printf("成员1地址:%x\n",&(A.ccc));
    printf("成员2地址:%x\n",&(A.a));
    printf("成员3地址:%x\n",&(A.b));
    printf("结构体变量A所占内存%d\n",sizeof(A));  //结构体变量A所占内存空间始终大于结构的大小,原因是因为内存对齐
    return 0;
}

若出现以下错误,解决方案是:在项目属性->配置属性->清单工具->输入输出嵌入清单该“是”为“否”,即可解决问题

image

结果如下所示:

image

 

#include<stdio.h>
#define MIN(A,B)  (A>B?B:A)
void main()
{

 

int A=2;
    int B=1;
    printf("%d",MIN(A,B));
}

 

  • cosnt

关于书上说的“编译的时候分配内存”http://www.cnblogs.com/helinsen/archive/2012/10/02/2710460.html

const作用http://blog.csdn.net/gulin20475/article/details/6747660

include和extern的关系

两种情况下:左边const相当于define,不分配内存,编译器经过类型检查后直接用100在编译时替换;右边是普通变量,分配内存;加extern就会分配内存

imageimageimage

 

const变量默认是内部部链接,普通变量默认是外部链接

//test.cpp
#include<stdio.h>
const int r=100;    //1处:普通变量默认就是extern,但是const是默认内部链接的,如果要外部连接必须加上extern
extern void print();
void main()
{
    print();
}

test1.cpp
#include<stdio.h>
extern int r;//2处
extern void print()
{
    printf("%d",r);
}

会在链接时出现以下错误(编译正确):原因就是普通变量默认就是extern,但是const是默认内部链接的,如果要外部引用必须加上extern

image

所以1处修改为:extern const int r;同样会出现以上错误,这次的原因就在于2处的extern int r没加const。接着修改2处为extern const int r;成功!

cost 引用

image

 

 

什么情况下不能重载,什么情况下不能重载?

void f(int i) {......} file://一个函数
void f(int i) const {......} file://上一个函数的重载
关于函数overloading, 不能根据返回值类型来确定
double max( int a, int b);
int max( int a, int b);
也不能根据参数的默认值来判断
int max( int a, int b);
int max( int a, int b, int c=12);

 

const成员函数:

它的声明形如:
int f( ) const;//const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法

 

//假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f( )来对这个r进行++r操作,代码如下
void X::f( ) const
{ (const_cast<X*>(this)) -> ++r; } //通过this指针进行类型强制转换实现
另外一种方法就是使用关键字:mutable。如果你的成员变量在定义时是这个样子的:
mutable int r ;
那么它就告诉编译器这个成员变量可以通过const成员函数改变。编译器就不会再理会对他的检查了。

posted @ 2014-03-19 20:06  yexuannan  阅读(538)  评论(0编辑  收藏  举报