153、 回答下面的问题
(1).Void GetMemory(char **p, int num){
*p = (char *)malloc(num);//一级指针的值被修改 }
void Test(void){
char *str = NULL;
GetMemory(&str, 100);//传递的是一级指针的地址 strcpy(str, \printf(str); }
请问运行Test 函数会有什么样的结果? 答:输出“hello”
(2).void Test(void){
char *str = (char *) malloc(100); strcpy(str, “hello”); free(str);
if(str != NULL){
strcpy(str, “world”); printf(str);}
}
请问运行Test 函数会有什么样的结果? 答:输出“world”
(3).char *GetMemory(void){
char p[] = \在函数栈 (默认局部栈中,如果有静态的则 放在全局栈中)中数组p在离开作用域 以后内存数据(数组p)有可能被修改,也 有可能不被修改,返回很危险。*/ return p;}
void Test(void){ char *str = NULL; str = GetMemory();
printf(str);}
请问运行Test 函数会有什么样的结果? 答:无效的指针,输出不确定 (4).void GetMemory(char *p){ p = (char *)malloc(100);} void Test(void){ char *str = NULL;
GetMemory(str);
strcpy(str, \
printf(str);}
请问运行Test函数会有什么样的结果? 答:程序崩溃
输出“world”,由于free后并没有解除内存映射,所有不会出现段错误,但是非法的访问内存,指针释放后应该设为NULL。 (3).char *GetMemory(void){ char *p = \return p; } void Test(void){ char *str = NULL; str = GetMemory(); printf(str); } 请问运行Test 函数会有什么样的结果? 答:hello world (3).char *GetMemory(void){ static char p[] = \return p;} void Test(void){ char *str = NULL; str = GetMemory(); strcpy(str, “i love you”); printf(str);} 请问运行Test 函数会有什么样的结果? 答:i love you (3).char *GetMemory(void){ static char p[] = \ /* static char p[]; 静态储存区(全 局栈) “hello world”;字符串,字面值储存 在代码区*/ return p; } void Test(void){ char *str = NULL; str = GetMemory(); printf(str); } 请问运行Test 函数会有什么样的结 果? 答:hello world #include
122. strcpy()和memcpy()都可以用来拷贝字符串,strcpy()拷贝以’\\0’结束,但memcpy()必须指定拷贝的长度,memset ,memcpy 的区别:
void *memset( void *buffer, int ch, size_t count );
功能: 函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。例如: memset( the_array, '\\0', sizeof(the_array) );
这是将一个数组的所以分量设置成零的很便捷的方法。memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为'\\0'。 void *memcpy( void *to, const void *from, size_t count ); 功能:函数从from中复制count 个字符到to中,并返回to指针。 如果to 和 from 重叠,则函数行为不确定。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
125.已知strcpy函数的原型是:char *strcpy(char *strDest,const char *strSrc);不调用库函数,实现strcpy函数:
char *strcpy(char *strDest, const char *strSrc) {
if(strDest == NULL || strSrc == NULL) return NULL;
if(strDest == strSrc) return strDest;
char *tempptr = strDest;
while( (*strDest++ = *strSrc++) != ‘\\0’); return tempptr; }
156、编写strcat函数,已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。 (1)不调用C++/C 的字符串库函数,请编写函数 strcat,VC源码: char * __cdecl strcat (char * dst, const char * src) {
char * cp = dst; while( *cp )cp++;
while( *cp++ = *src++ ) ; return( dst ); }
32.已知String类定义如下: class String {
public:
String(const char *str = NULL); // 通用构造函数 String(const String &another); // 拷贝构造函数 ~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函数 private:
char *m_data; // 用于保存字符串 };
尝试写出类的成员函数实现:
String::String(const char *str)
{
if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断 { m_data = new char[1]; m_data[0] = '\\0'; }
String::String(const String &another) {
m_data = new char[strlen(another.m_data) + 1]; strcpy(m_data,other.m_data); } else { }
m_data = new char[strlen(str) + 1]; strcpy(m_data,str);
}
String& String::operator =(const String &rhs) {
if (this == &rhs) return *this;
delete []m_data; //删除原来的数据,新开辟一块内存 m_data = new char[strlen(rhs.m_data) + 1]; strcpy(m_data,rhs.m_data); return *this ;
}
String::~String() { }
delete []m_data ;
28. 总结const的应用和作用?
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量; (5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
(6)全局常量储存在代码区,局部静态常量也储存在代码区
13. 什么是常对象?
答:常对象是指在任何场合都不能对其成员的值进行修改的对象。
28. const char *p,char * const p的区别: 如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
84. 什么是常指针,什么是指向常变量的指针? 常指针的含义是该指针所指向的地址不能变,但该地址所指向的内容可以变化,使用常指针可以保证我们的指针不能指向其它的变量;指向常变量的指针是指该指针的变量本身的地址可以变化,可以指向其它的变量,但是它所指的内容不可以被修改。
81. 总结static的应用和作用?
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
14. 静态函数存在的意义?
答:静态私有成员在类外不能被访问,可通过类的静态成员函数来访问;当类的构造函数是私有的时,不像普通类那样实例化自己,只能通过静态成员函数来调用构造函数。
23. 对象间是怎样实现数据的共享的? 答:通过类的静态成员变量来实现的。静态成员变量占有自己独立的空间不为某个对象所私有。
89. static函数与普通函数有什么区别?
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
80. 简述全局变量的优缺点?
全局变量也称为外部变量,它是在函数外部定义的变量,它属于一个源程序文件,它保存上一次被修改后的值,便于数据共享,但不方便管理,易引起意想不到的错误。
133.将“引用”作为函数参数有哪些特点?
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量