编写总结面试试题有两个目的,一是便于应对笔试,另一个更重要的目的是面试试题中的知识往往是工作中更常见更容易用到的,在此加深一下印象。
1, str[]和*str的区别。请说说下例的输出结果
char str1[] =“abc”;
char str2[] =“abc”;
const charstr3[] = “abc”;
const charstr4[] = “abc”;
const char *str5= “abc”;
const char *str6= “abc”;
char *str7 =“abc”;
char *str8 =“abc”;
cout << (str1 == str2 ) << endl;
cout << (str3 == str4 ) << endl;
cout << (str5 == str6 ) << endl;
cout << (str7 == str8 ) << endl;
结果:0 0 1 1
解释:
当字符串是数组形式声明并初始化,编译器认为是新数组,分配新空间。而如果是相同的字符串,用指针声明,字符串常量存储在静态存储区,那就是比较如果有一样的字符串,就直接把新指针指过去,只有一份。
2, 求数组str[]的大小
下列实现是否正确,请指出原因
intmyStrLen(char str[])
{
return (int)(sizeof(str)-1);
}
不正确,因为函数的参数传递中,数组指针已完全退化为指针,32位系统中指针的大小恒为4,得不到数组的大小。
3, 指出下例的错误
char a;
char*str=&a;
strcpy(str, “hello”);
cout<<str;
访问了未分配的空间。注意:在执行strcpy时,不会报错。该案例中,只为str分配了一个字节的空间,但却赋值6个字节。
4, 函数传递指针的时候是副本
见下例:
void GetMemory(char *p)
{
p=new char[100];
strcpy(p,"helloworld");
}
void main(void)
{
char *str=NULL;
GetMemory(str);
cout<<str;
delete []str;
str=NULL;
}
编译器正确,但程序不能通过。其实原因很简单,GetMemory这个函数出问题了。函数参数是不能传递分配空间,因为传递过去实际上是一个副本p不能返回的。而且你在delete那就是件很危险的事情..因为str没有分配空间。可改为以下写法:
void GetMemory(char **p) // 改成晦涩难懂的指针的指针
{
*p=newchar[100]; //给*p的分配地址
strcpy(*p,"helloworld"); // 拷贝内容到*p
}
void main(void)
{
char *str=NULL;
GetMemory(&str);//这地方取地址
cout<<str;
delete []str;
str=NULL;
}
5,用变量a给出下面的定义
a) 一个整型数
inta;
b)一个指向整型数的指针
int*pa;
c)一个指向指针的的指针,它指向的指针是指向一个整型数
int**pa;
d)一个有10个整型数的数组
inta[10];
e) 一个有10个指针的数组,该指针是指向一个整型数的。
Int*a[10];
f) 一个指向有10个整型数数组的指针
int(*a)[10]
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
int(*fun)(int);
h) 一个有10个指针的数组,该指针指向一个函数,函数有一个整型参数并返回一个整型数
int(*fun[10])(int);