2021.4.15牛客刷题小结
前言
提示:个人记录用,以下内容仅供参考。
C++
1、联合体
1、联合体的成员是共址的。
2、联合的成员在某一个时刻只有当前的是有效的。
3、联合变量占有的内存空间是该联合变量中占有最大内存空间的成员在内存对齐时所需的存储空间
4、test变量的定义可以初始化,初始值的类型必须是union中第一个成员的类型。
2、字符指针数组
char *a[]={ "fortran", " basic", "pascal", "java", "c++" };
a[3]的值为 “java”
*a[3]的值为 j
3、sizeof
char str[]="Hello";
printf("%d\n",sizeof(str));
结果为 6。
对字符串sizeof的时候,会把结束符’\0’算进去,进行strlen的时候不会计算。
4、基类指针
struct A{
void foo(){printf("foo");}
virtual void bar(){printf("bar");}
A(){bar();}
};
struct B:A{
void foo(){printf("b_foo");}
void bar(){printf("b_bar");}
};
int main()
{
A *p=new B;
p->foo();
p->bar();
return 0;
}
A是基类,B是派生类,p是基类指针。
p->foo();的输出结果为 foo
p->bar();的输出结果为 b_bar
foo() 不是虚函数,所以p->foo()直接实现A中定义的函数。
bar() 是虚函数,所以p->bar()会实现B中重写的bar()。
总结:
基类指针指向派生类,此指针指往虚函数时。
若此虚函数在派生类已经实现,程序会执行派生类的虚函数。
如果指向普通函数,那么程序会执行基类中定义的函数。
5、后++
*p++和*(p++)都是先取*p的值再将p自增
6、静态成员
非静态成员函数也可以操作静态数据成员。
7、虚基类
多重继承引起的二义性:
假如上述这些基类(B和C)具有相同的基类A,A中的成员数据和成员函数,最终都会以双份的形式拷贝到类D中,
那么调用的时候就会出现二义性问题。
虚基类:
专门用来解决多重继承引起的二义性问题;(可以理解为D直接从A继承)
8、函数错误
void test1()
{
unsigned char array[MAX_CHAR+1],i;
for(i=0;i<=MAX_CHAR;i++){
array[i]=i;
}
}
char*test2()
{
char p[] = "hello world";
return p;
}
char *p =test2();
void test3(){
char str[10];
str++;
*str='0';
}
第一个问题:
重点不在于CHAR_MAX的取值是多少,而是在于i的取值范围是多少。
一般char的取值范围是-128到127,而u char 则是0-255,所以i的取值范围是0-255.
所以当CHAR_MAX常量大于255时,执行i++后,i不能表示256以上的数字,所以导致无限循环。
第二个问题:
重点在于函数中p的身份,他是一个指针,还是数组名;
如果是指针p,则p指向存放字符串常量的地址,返回p则是返回字符串常量地址值,调用函数结束字符串常量不会消失(是常量)。所以返回常量的地址不会出错。
如果是数组p,则函数会将字符串常量的字符逐个复制到p数组里面,返回p则是返回数组p,但是调用函数结束后p被销毁,里面的元素不存在了。
例子中p是数组名,所以会出错,p所指的地址是随机值。
若是把char p[]=“hello”;改成char *p=“hello”;就可以了。
第三个问题:
重点在于str++;这实际的语句就是str=str+1;而str是数组名,数组名是常量,所以不能给常量赋值。
总结
今天发表了两篇博客,简单说明了以下ffmpeg的使用和八个基础排序算法,加油吧,刷的题还是很多基础容易错,基础不够扎实,晚上再看看树或者操作系统。加油。