c/c++ 常见笔试面试小知识
2015-11-02 18:22
260 查看
1.
问有语句: char *p="asd"; 是否可执行 p[0]='q'; ?
语句char *p="asd"; 只是定义了一个指针变量,指向了一个常量字符串,所以p[0]='q';是不允许的。而p="qwe"; 确是允许的,因为p是变量。
2.
问 void fun(char *p){p=new char[10];}
void main()
{
char *p;
fun(p);
}
是否给p分配了内存?
因为void fun(char *)相当于传递了地址变量的值,其临时变量值只存在于fun函数中,所以p并没有指向有效分配的内存(即p值没有改变)。正确做法为void fun(char * &p){p=new char[10];}
3.
问:
char str1[]="asdfg";
char *str2="asdfg";
char str3[5]={'a'};
void fun(char * str4);
void fun(char str5[]);
sizeof(str1),strlen(str2) ,strlen(str3), strlen(str4),sizeof(str1),sizeof(str2),sizeof(str3),sizeof(str4)位多少 ?
sizeof(str)若str为指针,则无论str是什么类型的指针,其值均为4;若str为数组,则sizeof(str)返回值为数组长度*数组类型长度(若类型为char类型长度为1,若为int类型长度为4....)
strlen(str) 中str为字符串地址,返回从第一个非字符串结尾字符开始的字符直到结尾字符为止的长度(不包括结尾字符'\0'),对于str1默认数组长度为6,5个字符一个'\0',所以strlen(str1)为5,strlen(str3)为1,若 char str3[5] = { 'a','b','c','d','e' };那么strlen(str3)值一般大于5,这个与编译器有关。对于函数参数中的无论是数组形式还是指针形式,形参中都当作指针,即sizeof(str5)值为4.
---未完待续
问有语句: char *p="asd"; 是否可执行 p[0]='q'; ?
语句char *p="asd"; 只是定义了一个指针变量,指向了一个常量字符串,所以p[0]='q';是不允许的。而p="qwe"; 确是允许的,因为p是变量。
2.
问 void fun(char *p){p=new char[10];}
void main()
{
char *p;
fun(p);
}
是否给p分配了内存?
因为void fun(char *)相当于传递了地址变量的值,其临时变量值只存在于fun函数中,所以p并没有指向有效分配的内存(即p值没有改变)。正确做法为void fun(char * &p){p=new char[10];}
3.
问:
char str1[]="asdfg";
char *str2="asdfg";
char str3[5]={'a'};
void fun(char * str4);
void fun(char str5[]);
sizeof(str1),strlen(str2) ,strlen(str3), strlen(str4),sizeof(str1),sizeof(str2),sizeof(str3),sizeof(str4)位多少 ?
sizeof(str)若str为指针,则无论str是什么类型的指针,其值均为4;若str为数组,则sizeof(str)返回值为数组长度*数组类型长度(若类型为char类型长度为1,若为int类型长度为4....)
strlen(str) 中str为字符串地址,返回从第一个非字符串结尾字符开始的字符直到结尾字符为止的长度(不包括结尾字符'\0'),对于str1默认数组长度为6,5个字符一个'\0',所以strlen(str1)为5,strlen(str3)为1,若 char str3[5] = { 'a','b','c','d','e' };那么strlen(str3)值一般大于5,这个与编译器有关。对于函数参数中的无论是数组形式还是指针形式,形参中都当作指针,即sizeof(str5)值为4.
---未完待续