C++学习(11)

1、  在C语言中,以“e”或“E”后跟一个整数来表示以“10”为底数的幂数。2.3026可以表示为0.23026E1、

2.3026e0、23.026e-1。C语言语法规定,字母e或E之前必须要有数字,且e或E后面的指数必须为整数。

如e3、5e3.6、.e、e等都是非法的指数形式。注意:在字母e或E的前后以及数字之间不得插入空格。

 

2、  使用setw()对数据进行格式输出时,应包含(iomanip.h)文件。

使用运算符对数据进行格式输出时,必须要包含(iomanip.h)文件

 

关于格式化输入与输出,标准库定义了一组操纵符(manipulator)来修改流的格式状态。(可参见《C++ Primer》 P666 ”格式化输入与输出“)

这些操纵符(如setprecision以及其他接受参数的操纵符)都定义在头文件 iomanip 中。(《C++ Primer》 P669) 

(可根据IO库中操纵符的英文书写manipulator来记住该头文件名称:iomanip.h)

 

3、  设有以下函数voidfun(int n,char *s) (……),则用函数指针 的定义和赋值正确的是:

void (*pf) (int n,char *s); pf=fun;

分析:实测在定义函数指针时可以带形参,编译器不会报错。 函数指针的赋值直接引用函数名和函数名上取地址符号是等价的。

 

4、  int a[5]={1,2,3,4,5};

int *ptr=(int *) (&a+1);

printf(“%d,%d”,*(a+1),*(ptr-1));输出2,5

分析:
*(a+1)其实很简单就是指a[1],输出为2.
问题关键就在于第二个点,*(ptr-1)输出为多少?
解释如下,&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。所以int *ptr=(int *)(&a+1);其实ptr实际是&(a[5]),也就是a+5.

原因为何呢? 
&a是数组指针,其类型为int(*)[5];
而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int),所以ptr实际是a[5],但是ptr与(&a+1)类型是不一样的,这点非常重要,所以ptr-1只会减去sizeof(int*),a,&a的地址是一样的,但意思就不一样了,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。 

5、  char *p = new char[100];

分析:p在栈上, new出来的在堆上。(动态分配在堆中,其他内存分配在栈上)

堆(heap)程序员分配释放;栈(stack)编译器自动分配释放。

 

6、   

分析一:int 4,enum 4,union 14(因为 pack(2)),总22.


分析二:int i:4字节;
union:13字节(共用内存),2字节对齐,13+1=14字节。
enum:3字节。2字节对齐,3+1=4

 

分析三:

int i,得到4个字节。
union对齐方法:
char buff[13]与int i,char类型1个字节,int 4个字节,取较大的4个字节;然后与系统默认对比,由于设置了pack(2),系统默认为2。取较小的,即2个字节对齐。union就是2字节对齐。
但是union本身占用13个字节,以2对齐,所以最终为14个字节。
最后那个4字节,不用说了。
需要注意,不论char buff[]有都大,对齐是根据数据类型对齐。
还有一点,由于各个数据成员都可以乘除2,所以数据成员之间不需要padding,并且结构体中最长为4,系统默认为2,所以最终结构体也不需要padding。 


 



7、   运算符优先级正确排序:

赋值运算符< 逻辑运算符<关系运算符<算术运算符

 

8、   unsigned long val= 0;

char a= 0x48;

    char b= 0x52;

val = b<<8 |a;

执行完代码,VAL的值是:21064

 

9、   构造函数没有声明返回值的必要;

 

构造函数有多种方式,所以是可以用private的,只是在外部这种方法不能给实例化;

 

构造函数必须保持类名一样才能实例化;

构造函数可以带参数;

 

10、 函数重载条件:函数名相同,参数类型或者个数不同,返回类型不能视为重载;

 

11、

理由如下:


1.c_str()返回值是const char*,返回一个指向正规C字符串的指针;

2.string b=a是C++中string类的赋值操作,b会开辟一个与a同等长度的内存空间,把a的字符串拷贝到b的内存空间中;

所以if(a.c_str()==b.c_str())比较的是2个const char*,很显然是不等的。

 

11、 const在*左边,如const char*p,表示p所指向的变量内容不可改变,指针指向可以改变

 

const在*号右边,如char *const p;表示p是个常量指针,即不能指向其他变量,而指向的变量内容可以改变

 

const出现在*的中间,如char * const  *p;表示p的指向于指向的变量内容都不可改变;

 

12、计算机中,表示汉子时,UTF-16是用2个字节,UTF-8是用三个字节。如果保存文本文件,还需要标识,UTF-16占用两个字节,UTF-8占用三个字节、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值