第一题、
int (* (*f)(int, int))(int)这里的f是什么?
答案:f是指针,指向一个参数为(int,int),返回值为一个指针的函数
这个返回的指针指向一个参数为(int),返回值为int的函数
第二题、
#include <stdio.h>
typedef struct
{
char data[10];
}T1;
typedef struct
{
T1 p;
int data[0];
}T2;
int main()
{
printf("%d\n", sizeof(T2));
return 0;
}
输出结果为12字节
第三题、
.下面哪些编译通不过?
(A).
void T()
{
const int N=100;
int a[N];
a[2]=42;
}
(B).
void T()
{
*((int* const)0x23567890)=5;
}
(C).
char* fuc(void)
{
char a[4];
strcpy(a,"abcd");
return a;
}
答案:ABC都可以通过编译。
第五题、下面程序的运行结果是多少?(D)
main () {
char chr = 127;
int sum = 200;
chr += 1;
sum +=chr;
printf(“sum = %d\n”,sum);
return(0);
}
A: 327 B:328 C:99 D:72
第六题、 编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
int GetCommon(char *s1, char *s2, char **r1, char **r2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
int maxlen = 0;
for(int i = 0; i < len1; i++)
{
for(int j = 0; j < len2; j++)
{
if(s1 == s2[j])
{
int as = i, bs = j, count = 1;
while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])
count++;
if(count > maxlen)
{
maxlen = count;
*r1 = s1 + i;
*r2 = s2 + j;
}
}
}
}
利用指针来实现:
- #include "stdafx.h"
- #include "stdio.h"
- #include "malloc.h"
- #include "string.h"
- char *maxsubstr(char *str1, char *str2)
- {
- char *p1, *p2, *q1, *q2, *destp;
- char *substr;
- int max=0, len;
- p1 = str1;
- while(*p1!='\0')
- {
- q1=str2;
- while(*q1!='\0')
- {
- len=0;
- p2=p1;
- q2=q1;
- while((*p2!='\0')&&(*q2!='\0'))
- {
- if(*p2==*q2)
- {
- p2++;q2++;len++;
- }
- else
- break;
- }
- if(len>max)
- {
- max = len;
- destp =p1;
- }
- q1++;
- }
- p1++;
- }
- substr=(char*)malloc(sizeof(char)*max);
- strncpy(substr,destp,max);
- return substr;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- char *s1="easderfghjkl";
- char *s2="jasdwfghjewserfghjk";
- char *sub;
- printf("%s\n%s\n",s1,s2);
- sub = maxsubstr(s1,s2);
- printf("the max sub string is:%s",sub);
- return 0;
- }
第七题、
输入N, 打印 N*N 矩阵
比如 N = 3,打印:
1 2 3
8 9 4
7 6 5
N = 4,打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
解答:
#include <stdio.h>
#define N 5
int s[N][N];
void main()
{
int k = 0, i = 0, j = 0;
int a = 1;
for( ; k < (N+1)/2; k++ )
{
while( j < N-k ) s[i][j++]=a++;
i++; j--;
while( i < N-k ) s[i++][j] = a++;
i--; j--;
while( j > k-1 ) s[i][j--] = a++;
i--; j++;
while( i > k ) s[i--][j] = a++;
i++; j++;
}
for( i = 0; i < N; i++ )
{
for( j = 0; j < N; j++ )
printf("%d ", s[i][j]);
printf("\n");
}
}
第八题
编译和链接有什么不同?(如外部符号的处理)
答:
编译生成的是目标文件(object*.o);
编译过程中对于外部符号不做任何解释和处理。外部符号对应的就是“符号”
链接生成的是可执行程序
链接将会解释和处理外部符号。外部符号对应的是地址
第九题
有两个变量a,b,不使用“if”,"?:","switch"或者其他判断语句,
找出两个数中较大的数?
int max = (x + y + abs(x-y))/2
注意:如果x或者y中有一个数比较大时,有可能会造成整数溢出。
第十题
在结构体中double数据类型(32位系统占8字节)只需要4字节对齐(对于gcc),但是整个结构体的大小还是要为8的整数倍即double类型的整数倍。
第十一题
为什么C++中有了malloc/free还需要new/delete?
答:malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete 不是库函数。
第十二题
把八进制数x转换成十进制数y的表达式:y=x/10*8+x%10