• Q1.char p1[] = “Tencent”, void*p2 = malloc((10)在32位机器上sizeof(p1)和sizeof(p2)对应的值是?
  • A:对于一个数组, sizeof 返回这个数组所有元素占的总空间。而 strlen 不区分是数组还是指针,就读到 \0 为止返回长度。所以sizeof(p1)=8;void *p2=malloc(10),void* 是空指针,可以指向任意类型,不能操作void*所指对象,而32位机器指针占4位,所以sizeof(p2)=4
  • Q2.下面程序段的输出结果是
char *p1 = ”123”, *p2 = ”ABC”, str[50] = “xyz”;
strcpy(str + 2, strcat(p1, p2));
printf(“%s\n”, str);
  • A:出错!p1和p2都指向常量字符串,在常量区,所以不能对其进行操作;改为数组即可,但是用字符串初始化数组时要记得将数组长度加1,因为字符串默认的末尾有一个‘\0’;第二点要注意的是,strcat函数的p1要有足够的空间来容纳p1和p2连接后的串长。修改代码如下:
char p1[7] = "123";
char p2[] = "ABC";
char str[50] = "xyz";
strcpy(str + 2, strcat(p1, p2));
printf("%s\n", str);
  • Q3. 下列程序的输出结果是
void main()
{
printf("s1=│%15s│s2=│%-5s│","chinabeijing","chi");
}
  • A: s1=│chinabeijing□□□│s2=│chi│,解释:%15s表示输出占15个空格的位置,并且右对齐,左边多余的位置补空格,因为“chinabeijing”包含12个字符,所以输出时,左边要补上3个空格%-5s表示输出占5个空格的位置,并且左对齐,右边多余的位置补空格,因为”chi”包含3个字符,所以输出时,右边要补上2个空格。
  • Q4. 在32位大端模式处理器上变量b等于()?
unsigned int a= 0x1234; unsigned char b=*(unsigned char *)&a;
  • A: unsigned int a= 0x1234; 其中int是4字节, 大端存储(高位存储在低地址) ,补齐16进制表示为: 0x00 00 12 34, unsigned char b=*(unsigned char *)&a; 由于大端存储, 所以上述int a变量的最低地址存储的是 十六进制表示中最左边的1字节, 为0x00.若处理器为小端存储(低地址存储低位) 模式,则b的值为0x34
  • Q5. 假定CSomething是一个类,执行下面这些语句之后,内存里创建了__6__个CSomething对象?
CSomething a();   //没有创建对象,这里不是使用默认构造函数,而是定义了一个函数
CSomething b(2);  // 使用一个参数的构造函数,创建了1个对象
CSomething c[3];  // 使用无参构造函数,创建了3个对象
CSomething &ra = b;  // ra引用b,没有创建新对象
CSomething d=b;  // 使用拷贝构造函数,创建了1个新的对象d
CSomething *pA = c;  // 创建指针,指向对象c,没有构造新对象
CSomething *p = new CSomething(4);  // 新建1个对象
  • Q6:若有以下定义和赋值语句,则与&s[i][j]等价的是()
int s[2][3] = {0}, (*p)[3], i, j;
p = s;
i = j = 1;
  • A6:int s[2][3]是一个二维数组,int (*p)[3]是一个数组指针;与s[i][j]等价的是*(*(p+i)+j)、(*(p+i))[j]、*(*p[i]+j);与&s[i][j]等价的是*(p+i)+j