思索了几个C&C++实习生面试题
[TOC]
近期公司招C/C++实习生,看了一下公司面试题。觉得题目考点太偏向概念、语法题。缺少一些基本原理和实践题。 特意思索了5题。前3题关于指针/内容空间。后2题关于实践。
如有雷同,纯属巧合
题一
在C/C++中,以下代码的执行结果
char* str = "abcd";
str[0] = '1';
答:题中str的声明类型是char,但字符串常量指向的内存空间不可写。严格来说char是个指针并不是内置字符串类型(c#/java的string )。在C++中内置字符串类型是std::string
题二
小端字节序下,printf的打印结果是
int main()
{
short v = 0x1234;
char* p = (char*)&v;
printf("%x\n", *p);
return 0;
}
答:将低位字节在低地址的称作小端字节序。题中0x12在高字节位,0x34在低字节位。打印结果是34
题三
执行以下代码打印结果是?
#include <stdio.h>
void swap(int* pLeft, int* pRight)
{
// 交换指针
int* tmp =pLeft;
pLeft= pRight;
pRight = tmp;
}
int main()
{
int left = 1;
int right = 2;
int* pLeft = &left;
int* pRight = &right;
swap(ptrLeft, ptrRight);
printf("left = %d, right = %d\n", *pLeft, *pRight);
return 0;
}
答:C/C++中指针类型与基本数据类型一样属于值类型,指针以值类型传递给函数,传递前后的这两个指针值没任何关系,只不过它们共同指向同一个空间(*操作符)。所以swap函数内交换指针,并不会交换指向的空间。
题四
std::cout的打印结果?
#include <iostream>
#include <vector>
/*批量删除下标元素*/
void remove(std::vector<int>& vec, int indexs[], int indexsSize)
{
// 遍历要删除的下标
for (inti = 0; i < indexsSize; ++i)
{
int realIndex = indexs[j])
vec.erase(vec.begin() + realIndex);
}
}
int main()
{
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
int indexs[2] = {0, 1};
remove(vec, indexs, 2);
std::cout << vec[0] << std::endl;
return 0;
}
答:遍历(读)集合时增加/删除(写)元素,操作不当对结果有很大影响。众所周知std::vector的存储结构是线性空间,删除下标0的元素,会使原来下标1的元素调整到下标0。这种素的情况下,使用倒序遍历删除元素更为安全。
题五
写出以下代码的打印结果
//1
vector<char> vc;
vc.reserve(5);
vc.resize(3);
char* pbuf = &vc[0];
char szT[] = "abc";
memcpy(pbuf, &szT, sizeof(szT));
printf("%s\n", pbuf);
vc.push_back('d');
vc.resize(5);
printf("%s\n", pbuf);
vc[4] = 'e';
printf("%s\n", pbuf);
vc.push_back('f');
printf("%s\n", pbuf);
//2
struct stTa
{
char a = '1';
char b = '2';
char c = '3';
char d = '4';
char e = '5';
};
pbuf = &vc[0];
printf("%s\n", pbuf);
stTa* psta = new ((stTa*)pbuf)(stTa);
printf("%s\n", pbuf);
*((char*)(psta + 1)) = '6';
printf("%s\n", pbuf);
答:考察std::vector
原文:
https://lizijie.github.io/2019/11/15/%E6%80%9D%E7%B4%A2%E4%BA%86%E5%87%A0%E4%B8%AAC&C++%E5%AE%9E%E4%B9%A0%E7%94%9F%E9%9D%A2%E8%AF%95%E9%A2%98.html
作者github:
https://github.com/lizijie