C++面试题(三)

题目一:
sizeof是函数?准确的列出sizeof()功能。以下代码:
 
        
int a[10];

int *ptr;

以下内容作为右值时,是否准确,如果准确,值为多少?
 
        
sizeof(a);

sizeof(a[10]);

sizeof(a[1]);

sizeof(ptr);

sizeof(*ptr);

sizeof(int)*ptr;

(1)谈谈sizeof的理解?
(2)是否深究细节?

答题思路:
sizeof不是函数,C语言的一个关键字,作为右值时,求某个数据类型(sizeof(int))某个变量对应的数据类型sizeof(a)来定义某个变量时,在当前平台下所需要占内存空间的大小。并不是真正求某个变量本身的内存空间的大小,也不会涉及对这个空间的访问。
sizeof(a);   //找到a的类型,int[10]是a的类型,因此是一个数组,相当                                          //sizeof(int[10]),值40(32位平台)。
sizeof(a[10]);//a[10]本身是一个越界访问,但是,这里并不是去访问a[10]空间大小,                       //而是求它的类型。a[10]---*(a+10)即a 指向的类型,即int,因此,求                          //的是sizeof(int)即4个字节。
sizeof(a[1]); //同上4个字节
sizeof(ptr);   //指针本身类型需占用空间大小,32位平台4个字节。
sizeof(*ptr);  //Ptr指向的数据类型,因此int型,4个字节。
sizeof(int)*ptr; //编译出错。

题目二:
关于static的理解。首先要明确数据的存储类型和可执行文件的段域问题。
(1)定义一个静态变量。对应要理解auto存储类型。初始化,生存周期,作用域。
        static int i=10; //局部变量或者全局。
(2)定义一个函数的时候。在当前文件中可以访问,这个函数作用域为当前文件。
      static int fun();
(3)C++中类的成员定义时。有静态成员变量和静态成员函数。
如何在头文件中声明一个全局变量。能够初始化吗?
如果在头文件中定义一个静态变量,因为静态变量只属于某个文件,如果被多个.c文件包含,相当于定义了多个静态成员变量。
如果头文件中定义一个全局变量,如果被多个.c包含的话,要这样用:
在.h中:
extern int g_value; //注意,不要初始化值
然后在各个.c 的文件包含,同时在某一个.c 中初始化。

题目四:C++语言可以定义字符串变量,如string str;

题目五:若有定义语句:int a=10; double b =3.14;则表达式'A' + a +b的值类型是
 A  char  ,B int  , C double  ,D float
答案 C

解析:因为按照类型大的与类型小的运算,强制转换类型小的进行运算的规则,double >float > int > short> char 
题目六:关于C++线程问题:
(1)线程安全问题都是由全局变量及静态变量引起的
(2)若每个线程中对全局变量,静态变量只有只读操作,而无写操作,一般来说,这个全局变量是线程安全的。若有多个线程同时执行写操作,一般需要考虑同步,否则的话就可能影响线程安全。
(3)POSIX线程标准要求标准库中大多数函数是具备线程安全的。
(4)局部变量局部使用是安全的。为什么?因为Thread都有自己的运行堆栈,而局部变量是生存在堆栈中,大家不干扰。
(5)全局原生变量多线程读写是不安全的,全局变量实在堆中。
(6)函数静态变量多线程读写也是不安全的。
(7)volatile能保证全局整形变量是多线程安全吗?
    不能。volatile仅仅是告诫complier不要对这个变量作优化,每次都要从memory取数值,而不是从register。
(8)interlockedIncrement保证整型变量的自增的原子性。
写好多线程安全的法宝就是封装,使数据由保护的被访问到:
安全性:
局部变量 > 成员变量 > 全局变量
错误:C++标准中string保证是线程安全的。

题目七:程序打印值是?

#include <stdio.h>
void f(char**p){
   *p+=2;
}
main()
{
  char *a[] = {“123”, “abc”, “456”}, **p;
   p = a;
   f(p);
    printf("%s\r\n", *p);
}

答案: 3
解析:
*p+=2;相当于*p=*p+2;
其中*p指向字符串"123"的第一个元素,即‘1’,指针p向右后移2个元素地址,即指向‘3’。而*(p+2)才是基于p每次向后移一个字符串的长度,即*(p+2)指向“456”












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值