声明:题目是记忆的,大致意思相同,具体说法有差异,答案是搜索的,仅为参考。
一、简答题
1.c c++内存分配。
代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store)。
2.数组和链表的区别。
(1) 从逻辑结构角度来看
a, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
b,链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
(2)从内存存储角度来看
a,(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
b, 链表从堆中分配空间, 自由度大但申请管理比较麻烦.数组静态分配内存,链表动态分配内存;
数组在内存中连续,链表不连续;
数组元素在栈区,链表元素在堆区;
数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。
3.什么是野指针,如何避免?
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
(1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
(2)、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
if(p != NULL) // 没有起到防错作用
strcpy(p, “world”); // 出错
4.指针常量和常量指针的区别?
int const *p1 = &b;//const 在前,定义为常量指针,const修饰指向的对象,b可变,b指向的对象不可变
int *const p2 = &c;//*在前,定义为指针常量 ,const修饰指针c,c不可变,c指向的对象可变
5.全局变量是否可以定义在一个文件中,这个头文件被多个.c文件包含?
不可以,因为每个.c文件引用该.h文件时,会对.h中的函数重新定义一次。
如果全局变量被定义在可被多个.c文件包含的头文件中时,就会出现重复定义。
所以,应该是在某个.c文件里面定义,在.h中用extern进行声明
二、找错误
1.字符处理的问题,将"abc"变成"cba"。
具体代码忘记了,主要是strlen问题。
2.
int main() { int a[100]; int **p; p = &a; return 0; }
找错
3.忘记了
三、编程题
1.比较字符串大小,如果字符串1大于字符串2,返回1,相等返回0,小于则返回-1;
int strcmp(const char* str1, const char* str2) { int ret = 0; while(!(ret=*(unsigned char*)str1-*(unsigned char*)str2) && *str1) { str1++; str2++ } if (ret < 0) { return -1; } else if (ret > 0) { return 1; } return 0; }
2.单链表反置。
struct ListNode { int m_nKey; ListNode* m_pNext; }; #include "stdafx.h" #include <iostream> #include <fstream> using namespace std; struct ListNode { int m_nKey; ListNode* m_pNext; }; //构造链表 void CreateList(ListNode *&pHead) { fstream fin("list.txt"); ListNode *pNode = NULL; ListNode *pTmp = NULL; int data; fin>>data; while (data) { pNode = new ListNode; pNode->m_nKey = data; pNode->m_pNext = NULL; if (NULL == pHead) { pHead = pNode; pTmp = pNode; } else { pTmp->m_pNext = pNode; pTmp = pNode; } fin>>data; } } //翻转单链表 void ReverseLink(ListNode *&pHead) { if (NULL == pHead) { return; } ListNode *pNode = pHead; ListNode *Prev = NULL; ListNode *pNext = NULL; while (NULL != pNode) { pNext = pNode->m_pNext; if (NULL == pNext) { pHead = pNode; } pNode->m_pNext = Prev; Prev = pNode; pNode = pNext; } } void PrintList(ListNode *pHead) { if (NULL == pHead) { return; } ListNode *pNode = pHead; while (NULL != pNode) { cout<<pNode->m_nKey<<" "; pNode = pNode->m_pNext; } cout<<endl; } int _tmain(int argc, _TCHAR* argv[]) { ListNode *pHead = NULL; cout<<"原来的链表:"; CreateList(pHead); PrintList(pHead); ReverseLink(pHead); cout<<"翻转的链表:"; PrintList(pHead); return 0; }
3.实现atoi函数
#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"
/*
Converts a character string into an int or long
将一个字符串转化为整数
*/
int my_atoi(char s[])
{
int i,n,sign;
for(i=0;isspace(s[i]);i++); //跳过空白
sign=(s[i]=='-')?-1:1;
if(s[i]=='+'||s[i]==' -') //跳过符号位
i++;
for(n=0;isdigit(s[i]);i++)
n=10*n+(s[i]-'0'); //将数字字符转换成整形数字
return sign*n;
}
/*
Converts an int or long into a character string
将一个整数转化为字符串
*/
void my_itoa(int n,char s[])
{
int i,j,sign;
if((sign=n)<0) //记录符号
n=-n; //使n成为正数
i=0;
do{
s[i++]=n%10+'0'; //取下一个数字
}while((n/=10)>0); //循环相除
if(sign<0)
s[i++]='-';
s[i]='\0';
for(j=i-1;j>=0;j--) //生成的数字是逆序的,所以要逆序输出
printf("%c",s[j]);
}
void main()
{
int n;
char str[100];
my_itoa(-123,str);
printf("\n");
printf("%d\n",my_atoi("123"));
system("pause");
}
四、问答
1.你对卫士通的了解?
2.说出你胜任这份工作的理由?
5万+

被折叠的 条评论
为什么被折叠?



