题目一:
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”