自己整理的几个C面试小题

概念题:

1.c++中为什么用模板类?
a.与类型无关,具有很高的可复用性。
b.他在编译的时而不是运行时候检查数据类型,保证了类型安全性
c.他与平台无关的,具有可已移植性
d.可用于基本数据类型
e.可用来创建动态增长和减小数据结构  //?????

2.简介多态,虚函数,纯虚函数
多态:一个接口(方法),实现不同种功能
虚函数:用virtual修饰的重写方法
纯虚函数:在虚函数后面加上=0,告诉编译器这是纯虚函数
/*
如果在父类定义虚函数,那么在定义对象时,如果用父类定义对象,则执行父类的函数体
如果用子类定义对象,那么执行子类的函数体,这就实现了一个接口,不同功能的作用
*/

3.inline函数与非inline区别?
inline函数为内联函数,在函数调用时直接调用,而没有上下文环境
非inline在函数调用时则会保存上下文环境。

4.什么是函数重载?
允许函数名相同,但参数的类型或者参数的个数不能相同,并且不可以以返回值类型重载。

5.const在c++跟c中的不同?
C中的const:被修饰的内容不可以被改变,使用场合:修饰变量,函数参数,返回值等。
                        而且c中的const默认时外部链接,因此在不同编译单元中,如果有同名的const则会报错
C++中的const:1.类外的const默认时内部链接的,因才在不同的编译单元中可以重名
                          2.它是编译时常量,因此可以像#define一样使用,因此可以在头文件定义const变量,
                          并且在其包含的不同的cpp文件中使用不会引起命名冲突。
                          3.类中的const,与c语言中的一样
                          类中的const变量占用内存空间
                          类中的const成员变量,需要在构造函数初始化列表中初始化                        

引用与指针有什么区别?
『指针』是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。
『引用』跟原来的变量实质上是一个东西,只不过是原变量的一个别名
指针有多级的,而引用只有一级的
指针可以用const修饰,引用不可以
指针可以赋值NULL,引用不可以
sizeof指针:指针的大小
sizeof引用:所指变量(对象的)大小

malloc与new的区别?
1.malloc和free是c/c++语言的标准库函数,new/delete是运算符。他们都可以申请动态内存和释放
2.对于非内部数据类型的对象而言,malloc/free无法满足动态对象的要求。即定义对象时自动调用构造函数,对象结束时自动执行析构函数。
malloc/free可以在c和c++中使用,而new/delete只能在c++中使用。
new出来的指针带直接带类型信息的,相当与malloc加构造函数的执行。

编程题:

/*编程实现,对于输入任何一个非负数,打印输出与其等值的六进制数
 * */
#include <stdio.h>

int power(int num,int index)
{
        int i;
        int sum = 1;
        for(i=0;i<index;i++)
        {
                sum = sum * 10;
        }
        sum = num * sum;
        return sum;
}

int main()
{
        int temp;
        int sum = 0,res;
        int num,i=0;

        printf("输入一个非负数\n");
        scanf("%d",&num);

        while(num != 0)
        {
                temp = num % 6;
                num = num / 6;
                sum = sum + power(temp,i);
                i++;
        }
        printf("%d\n",sum);

        return 0;
}
/*编程实现,在已知字符串中查找子串,并返回第一个子串的首地址,如果没有返回空
 * */

#include <stdio.h>
#include <string.h>
char *findSub(char *a,char *b)
{
        int i,j,k = 0;
        for(i=0;i<strlen(a);i++)
        {
                if(a[i] == b[0])
                {
                        for(j=0;j<strlen(b);j++)
                        {
                                if(a[i+j] == b[j])
                                {
                                        k++;
                                        if(k == strlen(b))
                                        {
                                                return a+i;
                                        }
                                }
                        }
                        k = 0;
                }
        }
        printf("无子串\n");
        return NULL;
}
int main()
{
        char a[] = "asdfjhqklfhs";
        char b[] = "sd";
        char *p = NULL;

        printf("%p\n",a);
        p = findSub(a,b);
        printf("%p\n",p);

        return 0;
}
/*"标识符"是由小写字母,大写字母,数字组成的字符串
 * 1.大写字母后面不能是数字
 * 2.首字母不能是数字
 * */
#include <stdio.h>
#include <string.h>
int low(char ch){
        if(ch>='a' && ch<='z'){
                return 1;
        }else{
                return 0;
        }
}

int up(char ch){
        if(ch>='A' && ch<='Z'){
                return 1;
        }else{
                return 0;
        }

}

int num(char ch){
        if(ch>='0' && ch<='9'){
                return 1;
        }else{
                return 0;
        }

}
int main()
{
        char arr[]= "as233dfdAHJASD";
        char *p = arr;
        int i;
        int flag = 0;

        for(i=0;i<strlen(arr);i++){
                if(!up(arr[i]) && !low(arr[i]) && !num(arr[i])){
                        printf("必须由大小写字母,数字组成\n");
                        return 1;
                }
        }
        if(num(*p) == 1){
                printf("首字母不能是数字\n");
                return 2;
        }
        while(*p != '\0')
        {
                if(flag && num(*p)){
                        printf("大写字母后面不能是数字\n");
                        return 3;
                }

                if(up(*p)){
                        flag = 1;
                }else{
                        flag = 0;
                }
                p++;
        }
        printf("right!\n");
        return 0;
}
/*一个数如果等于他的因子之和,这个数称之为“完数”,例如6=1+2+3 
 *编程找出1000以内的所有完数
 * */

#include <stdio.h>

int isRight(int num)  
{
        int sum = 0;
        int i;
        for(i=1;i<num;i++)
        {
                if(num%i == 0)
                {
                        sum = sum + i;
                }
        }
        return sum;
}

int main()
{
        int i;
        for(i=1;i<1000;i++)
        {
                if(i == isRight(i))
                {
                        printf("%5d",i);
                }
        }
        printf("\n");
        return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值