C/C++程序占用的内存分为以下几部分:
程序代码区:常量区存放常量。程序结束时由OS回收。
全局区(静态区)存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束时由OS回收。
堆区存放的变量(用new,malloc,calloc,realloc等分配内存函数得到的变量)由程序员分配释放。
栈区存放的变量(局部变量、函数参数等)由编译器自动分配释放
假定x和y为double型,则表达式x=2,y=x+3/2的值是
D 3/2这个是取整运算,3/2的整数部分是1,则2+1得3。又因为是double型变量,所以结果就是D
x = 218.82631; printf("%-6.2e\n", x);
6.2e 一个一个解释
6 表示输出的位宽,如果结果小于6位,则不足的部分以空格补充,如果超于6位则没影响;
.2 保留两位小数
e 以指数形式输出,即10的n次幂,e+02即表示10^2
- 负号,表示左对齐还是右对齐,2.19e+02 占9位(代码执行测试得到,通过不断修改6的结果,直到改到10,才出现了%6.2e输出时,左侧添加空格占位)。所以 - 表示左对齐,结尾右侧补空格,而+情况是右对齐,即左侧开头补空格
所以对于218.82631输出结果应为2.19*10^2,转换成计算机的代码输出格式即2.19e+02
下面哪个指针表达式可以用来引用数组元素a[i][j][k][l]
*(a+i) = a[i]
*(a+i)+j = a[i] +j
*((a+i)+j) = a[i][j]
*((a+i)+j)+k = a[i][j]+k
*( *((a+i)+j)+k ) = a[i][j][k]
*( *((a+i)+j)+k )+l = a[i][j][k]+l
*( *( *((a+i)+j)+k )+l ) = a[i][j][k][l]
则有语法错误的是()
int x =5;
const int * const p = &x;
const int &q=x;
int const *next=&x;
const int *j=&x;
A.p是指针常量,p是代表x的值,被定义为常量,不可再赋值,A错;
B.&q是对x变量的引用,但被定义为了常量,故q不再是变量,不能自增,B错;
C.如果const位于的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量,故x为常量,不能改变,但是next指向x的地址,next++表示改变地址,故c选项无语法错误;
D.(*j)++表示x的值自增,但是const int *j=&x表示x为常量,不能改变,故d错误
const详解
在32位系统上,下面函数的执行结果是输出
char str[] = “xunlei”;
char *p = str;
int n = 10;
printf("%d,%d,%d\n", sizeof(str), sizeof§, sizeof(n));
sizeof(str),str是字符数组,所以第一个是7个字节
sizeof§, str的首元素地址赋给指针p,指针总占4个字节
sizeof(n), int型整数,所以4个字节
char str[]=“xunlei”;
char str2[]={‘x’,‘u’,‘n’,‘l’,‘e’,‘i’};
//sizeof(str)计算’\0’,sizeof(str2)不计算’\0’
1、static_cast和dynamic_cast的区别:
1)static_cast
1.1)没有虚函数同样可以编译通过;
1.2)用于非多态类型转换(静态转换),任何标准转换都可以用它,
最常用的类型转换符,用于基本数据类型之间的转换,如把int转换为char,
但是不能用于两个不相关的类型转换。
1.3)用于类层次结构中基类和派生类之间指针或引用的转换,
上行转换(派生类---基类)是安全的,与dynamic_cast效果相同;
下行转换(基类---派生类)由于没有动态类型检查,所以是不安全的;
1.4) 把空指针转换成目标类型的空指针
1.5) 把任何类型的表达式转为void类型
1.6) static_cast不能转换掉expression的const、volatile、或者__unaligned属性
int e = 10;
const int f = static_cast<const int>(e);//正确,将int型数据转换成const int型数据
const int g = 20;
int *h =static_cast<int*>(&g);//编译错误,static_cast不能转换掉g的const属性
2)dynamic_cast
2.1)dynamic_cast只能用于有虚函数的类(必须有共有继承和虚函数),为运行时转换,由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的;
如果父类没有虚函数,编译报错;
2.2)用于类层次结构中基类和派生类之间指针或引用的转换,
上行转换(派生类--->基类)是安全的,与static_cast效果相同;
下行转换(基类--->派生类)具有类型检查的功能,转型是安全的,
当类型不一致时,转换过来的是空指针;
2.3)先检查能否转型成功,能成功则转型,不能成功则返回0
static_cast和reinterpret_cast的区别:
static_cast不适用于不同指针类型之间的转换, 因为它们是完全不同的两个类型.
如果 自己清楚自己在做什么, 通常对于不同指针类型的转换应该使用reinterpret_cast
new操作符的使用
栈中内存的分配和管理由操作系统决定,而堆中内存的分配和管理由管理者决定。
new详解