C/C++面试题-创新互联

为定襄等地区用户提供了全套网页设计制作服务,及定襄网站建设行业解决方案。主营业务为网站设计制作、成都做网站、定襄网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

分析一下程序的行为

分析程序的行为1
[chunli@CentOS c]$ cat file_1.c 
#include 
int main()
{
    char *function_1()
    {
        return "Hello";
    }
    char *str = function_1();
    printf("%s \n", str);
    return 0;
}
[chunli@CentOS c]$ gcc  file_1.c -Wall && ./a.out
Hello 



---------------------------------
分析程序的行为2
[chunli@CentOS c]$ cat file_1.c 
#include 
void test()
{
    char *function_1()
    {
        return "Hello";
    }
    char *str = function_1();
    printf("%s \n", str);

}
int main()
{
    test();
    return 0;
}
[chunli@CentOS c]$ gcc  file_1.c -Wall && ./a.out
Hello 
[chunli@CentOS c]$

用递归判断一个数组 是不是递增的

chunli@Linux:~$ cat main.c 
#include 
int IsIncreArray(int *arr,int len)
{
	if(len == 1)
		return 0;
	else
	{
		if(arr[len-1] < arr[len-2])
			return -1;
		else
			return IsIncreArray(arr,--len);
	}
}

int main()
{
	int array1[10] = {0,1,9,3,4,5,6,7,8,9};
	int len1 = sizeof(array1)/sizeof(array1[0]);
	if(IsIncreArray(array1,len1) == 0)
		printf("yes\n");
	else
		printf("no\n");


	int array2[10] = {0,1,2,3,4,5,6,7,8,9};
	int len2 = sizeof(array2)/sizeof(array2[0]);
	if(IsIncreArray(array2,len2) == 0)
		printf("yes\n");
	else
		printf("no\n");
	return 0;
}
chunli@Linux:~$ gcc main.c -Wall  && ./a.out 
no
yes
chunli@Linux:~$

求一个整数,二进制表示出来,有多少个1

#include 
using namespace std;
int func(int x)
{
        int count = 0;
        while (x)
        {
                count ++;
                x = x&(x-1);
        }
        return count;
}


int main(void)
{
        cout << func(9999) << endl;
        return 0;

}

chunli@pc0003:~$ g++ main.cpp && ./a.out 
8

i++问题

chunli魂斗罗~$ cat main.c 
#include 
#include 
int main()
{
	int a;
	a= 4;	a += (a++);	printf("%d\n",a);	//9
	a= 4;	a += (++a);	printf("%d\n",a);	//10
	//a= 4;	(a++) += a;	printf("%d\n",a);	//编译报错
	//a= 4;	(++a) += a;	printf("%d\n",a);	//编译报错

	return 0;
}
chunli魂斗罗~$ gcc main.c  && ./a.out 
9
10
chunli魂斗罗~$

关于i++,++i

#include 
using namespace std;
int main(void)
{
        int a,x;
        for(a=0,x=0; a<=1 && !x++;a++)
        {
                a++;
        }
        cout<
#include 
using namespace std;
int main(void)
{
        int a,x;
        for(a=0,x=0; a<=1 && !x++;)
        {
                a++;
        }
        cout<

解析:这两段代码的不同点就在for循环那里,前者是for(a=0,x=0; a<=1 &&!x++;a++),
后者是for(a=0,x=0;a<=1 &&!x++;)。
先说第1段代码。
第1步:初始化定义a=0,x=0。
第2步:a小于等于1,x的非为1,符合循环条件。
第3步:x++后x自增为1。
第4步:进入循环体,a++,a自增为1。
第5步:执行for(a=0,x=0;a<=1 &&!x++;a++)中的a++,a自增为2。
第6步:a现在是2,已经不符合小于等于1的条件了,所以“&&”后面的“!x++”不执行,x还是1,不执行循环体。
第7步:打印a和b,分别是2和1。

再说第2段代码。
第1步:初始化定义a=0,x=0。
第2步:a小于等于1,x的非为1,符合循环条件。
第3步:x++后x自增为1。
第4步:进入循环体,a++,a自增为1。
第5步:a现在是1,符合小于等于1的条件,所以“&&”后面的“!x++”被执行,x现在是1,x的非为0,不符合循环条件,不执行循环体,但x++依然执行,自增为2。
第6步:打印a和b,分别是1和2。
答案:第一段输出结果是21,第二段输出结果是12。

#include 
int main(void)
{
        int b =3;
        int arr[] = {6,7,8,9,10};
        int *p = arr;
        *(p++) += 123;
        printf("%d,%d\n",*p,*(++p));
}
chunli@pc0003:~$ gcc main.c && ./a.out 
8,8

解析:C中printf计算参数时是从右到左压栈的。
几个输出结果分别如下:
printf("%d\n ",*ptr);此时ptr应指向第一个元素6。
*(ptr++)+=123应为*ptr=*ptr+123;ptr++,此时ptr应指向第二个元素7。
printf("%d\n ",*(ptr-1));此时输出第一个元素129,注意此时是经过计算的。
printf("%d\n ",*ptr);此时输出第二个元素7,此时ptr还是指向第二个元素7。
printf("%d,%d\n",*ptr,*(++ptr));从右到左运算,第一个是(++ptr),也就是ptr++,*ptr=8,此时ptr指向第三个元素8,所以全部为8。

百鸡百钱问题:

#include 
#include 
void main()
{

        int i = 0;
        int j = 0;
        int k = 0;
        for(i=0;i<20;i++)
        {
                for(j = 0;j<34;j++)
                {
                        if((100 -i - j) == (100-5*i-3*j)*3 && (100-j-i)%3 == 0 )
                        {
                                printf("%d,%d,%d\n",i,j,100-i-j);
                        }
                }
        }
}

编译:

chunli@Linux:~/high$ ./a.out 
0,25,75
4,18,78
8,11,81
12,4,84
chunli@Linux:~/high$

蛇形数,

1,层数分析:

C/C++ 面试题

chunli@http://990487026.blog.51cto.com~/snake$ cat main.c 
#include 
#define  N  9	//定义矩形的边长

int main()
{
	int arr[N][N] = `0`;//抽象为二维数组模型
	int data = 1;//初始值
	int y = 0;//控制上下
	int x = 0;//控制左右
	int ring = 0;//控制层数
	//蛇形大法
	for(y=0,x=0,ring=0;ring<(N+1)/2;ring++)//控制层数
	{
		//向右跑
		while(xring-1)
		{
			arr[y][x] = data;
			x--;
			data++;
		}

		//向上跑
		y--;//
		x++;//
		while(y>ring)
		{
			arr[y][x] = data;
			y--;
			data++;
		}
		
		y++;//恢复为正常向下
		x++;//恢复为正常向右
	}

	//打印二维数组
	for(y = 0;y

蛇形数,换个方向:

C/C++ 面试题

chunli@http://990487026.blog.51cto.com~/snake$ cat main.c 
#include 
#define  N  25	//定义矩形的边长

int main()
{
	int arr[N][N] = `0`;//抽象为二维数组模型
	int data = 1;//初始值
	int y = 0;//控制上下
	int x = 0;//控制左右
	int ring_number = 0;//控制层数
	//蛇形大法
	for(y=0,x=0,ring_number=0;ring_number<(N+1)/2;ring_number++)//控制层数
	{
		while(yring_number-1)
		{
			arr[y--][x] = data++;
		}	
		
		x--;y++;//调整方向
		while(x>ring_number)
		{
			arr[y][x--] = data++;
		}

		x++;y++;//调整方向
	}
	//打印二维数组
	for(y = 0;y

指针问题1,求n的值

#include 
int main()
{

	char *p = new char[4];
	p[0] = 1;
	p[1] = 2;
	p[2] =3;
	p[3] = 4;
	int * pInt = (int *)p;
	int n = *pInt;
	printf("%x\n",n);
	printf("%d\n",n);
}
chunli@http://990487026.blog.51cto.com~/seq_queue$ g++ 1.cpp  && ./a.out 
4030201
67305985
chunli@http://990487026.blog.51cto.com~/seq_queue$

解析:

char *转译地址时按1个字节取值,

强转为int*,转译地址时按4个字节取值

指针问题2,求n的值

chunli@http://990487026.blog.51cto.com~/seq_queue$ cat 1.cpp 
#include 
int main()
{
	size_t *p = (size_t *)1000;
	size_t n = (size_t)(p + 100);
	printf("%ld\n",n);
}
chunli@http://990487026.blog.51cto.com~/seq_queue$ g++ 1.cpp  && ./a.out 
1800
chunli@http://990487026.blog.51cto.com~/seq_queue$

解析:

考察不同数据类型地址偏移的计算

继续指针步长问题

chunli魂斗罗~/review$ cat main.c 
#include 
int main()
{
	int a[5] ={1,2,3,4,5};
	int *ptr = (int*)(&a+1);
	printf("%d %d\n",*(a+1),*(ptr-1));
	return 0;
}
chunli魂斗罗~/review$ gcc -Wall main.c  && ./a.out 
2 5
chunli魂斗罗~/review$

当指针与引用在一起:

[root@linux tmp]# cat main.c
#include 
int fun(int * &a)
{
	printf("a=%d\n",*a);
	return 0;
}
int main()
{ 
	int a = 10;
	int *b = &a;
	fun(b);
	return 0;
} 
[root@linux tmp]# g++ main.c -Wall && ./a.out 
a=10
[root@linux tmp]#

当指针与引用在一起:

[root@linux tmp]# cat main.cpp 
#include 
#include 
#include 
void fun(int *&p)
{
	p = (int *)malloc(0);
	printf("in fun  %p\n",p);
}
int main(void)
{
	int *p = NULL;	printf("in main %p\n",p);
	fun(p);		printf("in main %p\n",p);

	return 0;
}
[root@linux tmp]# g++ main.cpp  -Wall && ./a.out 
in main (nil)
in fun  0x87e7008
in main 0x87e7008
[root@linux tmp]#

求数组中第N大的数

chunli魂斗罗~/review$ cat main.c 
#include 
#include 
void sort(int  *arr,int len)
{
	int i = 0;
	int j = 0;
	for(i = 0;i0;i++)
	{
		if(arr[i]!=arr[i+1])
		{
			num_max--;		
			max = arr[i];
		}
	}
	return max;
}

int main()
{
	int arr[] = {7,1,3,99,9,7,77,56,99,7,9,5,2,4};
	int len = sizeof(arr)/sizeof(int);
	printf("第1大的数是%d\n",max(arr,len,1));
	printf("第2大的数是%d\n",max(arr,len,2));
	printf("第3大的数是%d\n",max(arr,len,3));
	return 0;
}
chunli魂斗罗~/review$ gcc -Wall main.c  && ./a.out 
第1大的数是99
第2大的数是77
第3大的数是56
chunli魂斗罗~/review$

结构体字节对齐1

chunli魂斗罗~/review$ cat main.c 
#include 
typedef struct A
{
	char t:4;
	char k:4;
	unsigned short i:8;
	unsigned long m;
	
}A;
int main()
{
	printf("%ld\n",sizeof(A));
	return 0;
}
chunli魂斗罗~/review$ gcc main.c  && ./a.out 
16
chunli魂斗罗~/review$

结构体字节对齐2

chunli魂斗罗~/review$ cat main.c 
#include 
typedef struct A
{
	char str;	//1
	short x;	//2 与char对齐
	int num;	//4 基本宽度
}A;
int main()
{
	printf("%ld\n",sizeof(A));
	return 0;
}
chunli魂斗罗~/review$ gcc main.c  && ./a.out 
8
chunli魂斗罗~/review$

结构体字节对齐3

chunli魂斗罗~/review$ cat main.c 
#include 
typedef struct A
{
	char str;	//1
	int num;	//4 
	short x;	//2 
}A;
int main()
{
	printf("%ld\n",sizeof(A));
	return 0;
}
chunli魂斗罗~/review$ gcc main.c  && ./a.out 
12
chunli魂斗罗~/review$

递归实现图形输出

chunli魂斗罗~$ cat main.c 
#include 

void my_print(int num)
{
	if(!num)
	{
		return ;
	}
	my_print(num-1);
	int i = 0;	
	int j = 0;	
	for(i = 0;i

宏定义swap函数

chunli魂斗罗~$ cat main.c 
#include 
//#define swap(x,y) (x)=(x)^(y);(y)=(x)^(y);(x)=(x)^(y);//标准答案
#define swap(x,y) (x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y);//答案2

int main()
{
	int a = 1;
	int b = 2;
	printf("a=%d b=%d \n",a,b);
	swap(a,b);
	printf("a=%d b=%d \n",a,b);
	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
a=1 b=2 
a=2 b=1 
chunli魂斗罗~$

宏定义mix函数

chunli魂斗罗~$ cat main.c 
#include 
#define mix(x,y) ((x)<(y)?(x):(y))

int main()
{
	printf("mix=%d\n",mix(4,7));
	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
mix=4
chunli魂斗罗~$

宏定义函数求数组的长度

#define ST(t) ((sizeof(t)/sizeof(t[0])))
int arr[30];
int len = ST(arr);

定义宏,传入变量名,传出变量名

#include 
#define VAR_P(var) printf(#var)
int main()
{
        int a = 0;
        VAR_P(a);
        return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
achunli魂斗罗~$

插入法排序面试题:

chunli魂斗罗~$ cat main.c 
#include 
#include 
void arr_init(int *arr,int len)
{
	struct timespec tp;  
	clock_gettime(CLOCK_THREAD_CPUTIME_ID,&tp);  
	srand(tp.tv_nsec);
	int i = 0;
	for(i = 0;i=0 && arr[i-1]>t);j--)
		{
			arr[i] = arr[i-1];
			i--;
		}
		arr[i] = t;
	}
}
int main()
{
	int arr[30];
	int len = sizeof(arr)/sizeof(int);
	arr_init(arr,len);
	arr_print(arr,len);
	arr_sort(arr,len);
	arr_print(arr,len);
	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
29 24 41 17 32 36 39 26 45 37 38 14 1 23 15 49 22 25 28 6 29 1 14 17 30 49 49 31 10 16 
1 1 6 10 14 14 15 16 17 17 22 23 24 25 26 28 29 29 30 31 32 36 37 38 39 41 45 49 49 49 
chunli魂斗罗~$ 
chunli魂斗罗~$ gcc main.c && ./a.out
38 18 39 16 49 36 34 26 12 18 0 44 18 27 35 45 44 26 24 20 27 26 0 20 47 20 1 20 41 32 
0 0 1 12 16 18 18 18 20 20 20 20 24 26 26 26 27 27 32 34 35 36 38 39 41 44 44 45 47 49 
chunli魂斗罗~$ 
chunli魂斗罗~$ gcc main.c && ./a.out
19 34 44 20 9 30 1 45 0 12 44 9 14 42 2 5 13 36 5 14 11 11 46 17 43 15 46 34 15 1 
0 1 1 2 5 5 9 9 11 11 12 13 14 14 15 15 17 19 20 30 34 34 36 42 43 44 44 45 46 46 
chunli魂斗罗~$

判断一个数是不是2的幂指数

chunli魂斗罗~$ cat main.c 
#include 
#include 
int main()
{
	int a ;
	a = 4;
	printf("%c\n",a&(a-1)?'n':'y');
	a = 7;
	printf("%c\n",a&(a-1)?'n':'y');
	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
y
n
chunli魂斗罗~$

数据类型自动转换问题

chunli魂斗罗~$ cat main.c 
#include 
#include 
int main()
{
	unsigned int a = 6;
	int b = -20;
	(a+b>6)?puts(">6"):puts("<=6");
	unsigned long c = a+b;
	printf("%ld\n",c);
	

	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
>6
4294967282
chunli魂斗罗~$

自己完成strcpy函数

chunli魂斗罗~$ cat main.c 
#include 

char* my_strcpy(char *dest,const char* src)
{
	if(dest==NULL || src==NULL)
		return NULL;
	while(*dest++=*src++);
}
int main()
{
	char buf[30];
	char *str = "Hello World!";
	my_strcpy(buf,str);
	printf("%s\n",buf);


	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
Hello World!
chunli魂斗罗~$

字符转数字

chunli魂斗罗~$ cat main.c 
#include 

int char_to_int(char *str)
{
	int num = 0;
	while(*str != '\0')
	{
		num = num*10+*str-48;;
		str++;
	}
	return num;
}

int main()
{
	printf("%d\n",char_to_int("1213141516"));


	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
1213141516
chunli魂斗罗~$

求一个数的右4位

chunli魂斗罗~$ cat main.c 
#include 
int main()
{
	unsigned int n = 0x12345678;
	n = n<<28;
	n = n>>28;
	printf("%x\n",n);
	return 0;
}
chunli魂斗罗~$ gcc main.c && ./a.out
8
chunli魂斗罗~$

数组定义问题1,sizeof编译时为常量

chunli?魂斗罗~$ cat main.c 
#include 
int main()
{
	char arr[sizeof(char)];
	printf("%ld\n",sizeof(arr));
	return 0;
}
chunli?魂斗罗~$ gcc main.c  -Wall && ./a.out 
1
chunli?魂斗罗~$

数组定义问题2,const编译时为常量

chunli魂斗罗~$ cat main.c 
#include 
int main()
{
	const int a = 5;
	char arr[a];
	printf("%ld\n",sizeof(arr));
	return 0;
}
chunli魂斗罗~$ gcc main.c  -Wall && ./a.out 
5
chunli魂斗罗~$

数组定义问题1,const编译时为常量,

chunli魂斗罗~$ cat main.c 
#include 
int main()
{
	int a = 5;
	const char brr[a];//无法初始化
	char const arr[a];
	printf("%ld\n",sizeof(brr));
	printf("%ld\n",sizeof(arr));
	return 0;
}
chunli魂斗罗~$ gcc main.c  -Wall && ./a.out 
5
5
chunli魂斗罗~$

函数指针面试题1:

void*(*(*fun)(int))[10]

分析1:这是指针数组

分析2:fun为函数指针,参数类型为int,返回值为void*

综合:数组里面有10个元素,每个元素都指向一个void*的函数指针

函数指针面试题3:[超难]

int(*(*fun)())[10]();

fun是一个指针,指向一个函数,参数为空,返回值是指针,指针指向一个数组,

数组有10个元素,每个元素都是一个指针,指向一个参数为空返回值为int类型的函数


多态中虚函数表是编译时建立的,运行时调用

回调函数

chunli魂斗罗~$ cat main.c 
#include 
#include 
#include 
char *fun2(char *str){
	char *p = (char*)malloc(100);
	strcpy(p,str);
	return p;
}
char *fun1(char* (*p)(char *pp1),char *p2){
	return p(p2);
}
int main(){
	char *str = "abcdefghijkl";
	char *p = fun1(fun2,str);
	printf("%s\n",p);
	free(p);
	p = NULL;
	return 0;
}
chunli魂斗罗~$ gcc main.c  -Wall && ./a.out 
abcdefghijkl
chunli魂斗罗~$

C/C++ 面试题

C/C++ 面试题

C/C++ 面试题

C/C++ 面试题

C/C++ 面试题

C/C++ 面试题

C/C++ 面试题

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文题目:C/C++面试题-创新互联
文章网址:http://hbruida.cn/article/cojppc.html