C++常见问题(三)——宏定义、const、static、sizeof的相关实例

第一部分 宏定义

  宏定义的语法格式:#define <标识符><字符串>,其中的标识符就是所谓的符号常量,也称为”宏名”。预处理工作也叫宏展开。宏定义不占用内存和编译时间。 例题1:用#define实现宏,并求最大值。

#define MAX(x,y) (((x)>(y))?*(x):(y))

  注意在宏中需要把参数小心的用括号括起来,因为宏只是简单的文本替换,那么接下来给出一个实例来阐明刚才的说法。

例题2:

#define SQR(x) (x*x)
int main()
{
    int a,b=3;
    a = SQR(b+2);
}

  解析:这里定义的SQR(x)函数是想获得x的二次方,在第5行想得到(3+2)*(3+2)=25的结果。然而宏定义的展开是在预处理时期,这时并没有对b进行赋值,所以展开结果是a=(b+2*b+2)=11。为了达到原来的目的,需要改变原来宏定义后半部分为((x)*(x))

例题3:用宏定义得到一个数组所含的元素个数。

#define ARR_SIZE(a) ((sizeof(a))/(sizeof(a[0])))

第二部分 const的使用

const的作用: 1.const用于定义常量 2.const修饰函数形式参数:将输入参数为用户自定义类型和抽象数据类型时,将值传递改为“const &传递”可以提高效率。   例如void fun(A const &a);用引用传递不需要产生临时对象,省了临时对象的构造、复制、析构过程,为了防止引用改变a的值,所以加入const。 3.const修饰函数的返回值 4.const修饰类的成员函数:任何不需要修改数据成员的函数都应该使用const修饰,int GetCount(void) const;

例题4:const的使用

int main()
{
    const int x=1;
    int b=10;
    int c=20;

    const int* a1=&b;
    int* const a2=&b;
    const int* const a3=&b;

    x=2;   
    //x是整形变量,不能改变其值,假若x未初始化,那么x是一个随机数
    a1=&c;
    //const在int*的左侧,用来修饰指针所指向的变量,即指针指向为常量。
    //上述是修改的指针a1的本身,而不是指针所指向的内容。
    *a1=1;
    //该命令是修改指针指向的内容,是不允许的。
    a2=&c;
    //const在右侧,修饰指针,即指针本身是常量,该句错误。
    *a2=1;
    //指针指向1,允许。
    a3=&c;
    *a3=1;
    //上述两句都是const常量,都是不允许的。
}

第三部分 static变量

例题5: static的作用

1.在函数体内,一个被声明为静态的变量在函数被调用过程中维持其值不变。 2.在模块内,一个被声明为静态的变量可以被模块内所有函数访问,但是不能被模块外其它函数访问。 3.在模块内,被声明为静态的函数只能被这一模块内的其它函数调用。即函数被限制在声明它的模块范围内。

例题6

staic全局变量与普通全局变量的区别:static全局变量只初始化一次,防止在其它文件单元中被引用; staic局部变量与普通局部变量的区别:static局部变量只初始化一次,下一次依据上一次结果值。 staic函数与普通函数的区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。

第四部分:sizeof

例题7:使用sizeof计算普通变量所占空间

char str[]="Hello";
char* p = str;
int n = 10;
void* q = malloc(100);

sizeof(str)= ___;  //str表示数组,得到结果是数组占用内存的总空间,注意数组最后有一个元素保存字符串结束符,6
sizeof(p)= ___;  //指针变量,4
sizeof(n)= ___;  //int形变量,4
sizeof(q)= ___;  //指向100字节的堆内存,4
//如果数组变量被传入函数中做sizeof运算,则和指针的运算没有区别;否则会得到整个数组占用内存的总大小。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

C++拷贝构造函数

     拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)...

2158
来自专栏程序员互动联盟

【专业技术】C++虚函数的缺省参数

编者按:缺省参数,缺省函数,缺省构造函数,如果你有些迷糊,本文可以让你把它看个清楚。呵呵。 前些日子,有个同学问我一个关于虚函数的缺省参数问题。他是从某个论坛上...

2596
来自专栏用户2442861的专栏

深入 char * ,char ** ,char a[ ] ,char *a[] 内核

http://blog.csdn.net/daiyutage/article/details/8604720

312
来自专栏HappenLee的技术杂谈

C++雾中风景3:const用法的小结

const关键字,翻译成中文是常量,常数的意思。所以在绝大多数场合之中,const是来定义常量的,定义常量也是好的编程习惯。在C类语言之中,定义常量通常会使用宏...

773
来自专栏coding for love

JS原生引用类型解析1-Object类型

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

321
来自专栏nnngu

011 抽象类和接口的区别

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。 2、抽象类要被子类继承...

2695
来自专栏程序员宝库

走近 Python (类比 JS)

Python 是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有 Python 的身影。作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 ...

33911
来自专栏kevindroid

JNI所需的C语言知识小结

1395
来自专栏青枫的专栏

java基础学习_基础语法(上)02_day03总结

============================================================================= ==...

572
来自专栏老九学堂

10分钟,掌握90%的人都不会的指针算术结构!

上例中,一般而言数组名array 代表数组本身,类型是int[10],但如果把array 看做指针的话,它指向数组的第0 个单元,类型是int* 所指向的类型是...

591

扫码关注云+社区