下面是面试题的下载链接,题目还是很好的,想看的可以下载
1. 4 t是int类型的,所以是4
11 1(a)2(b)3( )4(c)5(\n)6(t)7(\012)8(\xa1)9(*)10(2)11(‘/0’)
2.主要牵扯栈的数据结构
栈:先入后出,最先入栈的,最后出栈,printf()执行过程就是一个入栈,出栈的过程
printf();函数返回值为打印的字符串 。
入栈 b = b*c; c = c*2;
出栈 c = c*2; b = b *c;
c = 60; b = 1200;
先执行后面的printf();语句,再执行前面的。
先打印1200+60+10.= 1270;再打印4;
(1)应该传一个指针,修改str的值
(2)字符串的长度为18,0结束标志不要忘
(3)程序最后最好加return 0;(建议)
ps:实际返回char *类型的函数也可以
#include<stdio.h>
#include<string.h>
#include<malloc.h>
void get_str(char **ptr) {
*ptr = (char*)malloc(17);
strcpy(*ptr,"Xiyou Linux Group");
}
int main(int argc,char *argv[]) {
char *str = NULL;
get_str(&str);
printf("%s\n",str);
return 0;
}
4.
size_t (*p(char *str))(size_t a) {
printf("%s\n",str);
return q;
}
size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。
sizeof返回的必定是无符号整形,在标准c中通过typedef将返回值类型定义为size_t.。
size_t(*p(char *str)) (size_t a)
*p(char *str)是一个函数指针,return q;q是一个函数名称,所以相当于size_t q(size_t a)。形参为size_t,返回值为size_t的函数。
5.static全局变量只能被该文件自己利用,外部文件不能够调用,相当于Java中的private的作用。
static局部变量只被初始化一次,下一次依据上一次结果值。函数static变量在函数中有效,第一次进入函数初始化(而不是进入相应的初始化语句)。以后进入函数将沿用上一次的值。
static函数和static全局变量作用相似。
6.
输出三个0
数组在内存中实际按照一维的方式进行存储的。
7.
const char *p
char const *p
char *const p
const char const*p
前两个都是指向常字符的指针,第三个是不能改变指向的字符指针,所以必须进行初始化,不然会报错,最后一个的是指向一个不可变字符的常指针。
8.
#include 会将指定文件的内容插入到源程序文件中
< >引用的是编译器的类库路径里面的头文件
" "引用的是你程序目录的相对路径中的头文件
运行的结果
b is 2
c is 5
a is 3
b is 2
a is 4
b is 2
switch case之间的语句b = 99;在编译的时候就已经被优化,不再存在。
逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。没有 break的话将继续向下执行。
10.
a为unsigned int型,b为int型,a+b的类型就变成unsigned int型。所以执行a+b>0里面的语句。%d则按有符号输出.。a+b输出-10.
11.
&nums相当于移动了整个数组,nums数组名称则代表数组的首元素地址。结果就很简单了
4
12.
Linux下 xiyouLinux Group
stdout 标准输出流,行缓冲,遇到换行符或者缓冲区满时才输出
stderr 标准错误流,直接输出到屏幕上
而在Windows下,stdout被设置不进行行缓冲,直接输出。
Group XiyouLiunx
13.
主要考察的补码
eg:
负数在内存中以补码方式存储,
-48通过48按位取反后加一得到
而char为一个字节的unsigned型
48 0000000000110000
-48 1111111111010000
赋给char后截取低八位:11010000
实际为208
即输出ASCII码值为208的字符
for(i = 0;i < 512;++i) {
str[i] = -1 -i;
printf("%d %c %d\n",i,str[i],str[i]);
}
i=255 str[i] = 0;所以strlen(str)=255
14.
1.宏函数
#define swap(a,b){a=a+b; b=a-b; a=a-yb;}
2.通过传标志位来获取数据类型,再进行强转
void swap(int flag, void* x, void* y){
if(flag == 1) {
int *p1;
int *p2;
int tmp;
p1 = (int *) _x;
p2 = (int *) _y;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}else if (flag == 2) {
double *p1;
double *p2;
double tmp;
p1 = (double *) _x;
p2 = (double *) _y;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
}
15.
#ifdef _linux_
int a = 1;
#elif _WIN32
int a = 2;
#elif _APPLE_
int a = 3;
#else
int a = 4;
#endif
防止在多平台编译下,出现相互影响的状况。
16.
有个学长写了10种方法,可以看下。
17.
1.内存对齐
一、结构体变量的首地址能够被其最宽基本类型成员大小与对齐基数中的较小者所整除;
二、结构体每个成员相对于结构体首地址的偏移量(offset)都是该成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
三、结构体的总大小为结构体最宽基本类型成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
2.大端和小端我的理解,大端就是符合我们平时的阅读习惯,从前前往后,而小端则是计算机的习惯,从后往前进行读数。
第一个相当于打印了5003
第二个打印了70005003
18.
主要就是宏定义, ##是黏连符 PRINTVAL中...表示可变参,_VA_ARGS_是可变参数的宏
cpp 后得到
int main(int argc,char *argv[]) {
int x1;
short *x2 = (short *)&x1;
char *x3 = (char *)&x2;
x1 = 0;
*x2 = -1;
printf("x""1"":" "%x\n",x1);
printf("x""2"":" "%x\n",*x2);
printf("x""3"":" "%x\n",*x3);
return 0;
}
19.
使用gcc编译程序时,编译工程分为4个阶段:
(1)预处理:(Pre-Processing)
(2)编译:(Compiling)
(3)汇编:(Assembling)
(4)链接:(linking)
第一阶段
在预处理阶段,输入的是C语言源文件,通常为*.c或者*.C,它们一般带有*h之类的头文件。这个阶段主要处理源文件中的#ifdef、#include和#define预处理命令。该阶段会生成一个中间文件*.i
1.生成预处理后的文件hello.i
$ gcc -E hello.c -o hello.i
它通过对源文件hello.c使用E选项来生成中间文件hello.i
第二阶段
在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s。这个阶段对应的gcc命令如下所示:
2 .生成汇编语言文件hello.s
$ gcc-s hello.i -o hello.s
第三阶段
在汇编阶段,将输入的汇编文件*.s转换成二进制机器代码*.o,这个阶段对应的gcc命令如下所示:
$ gcc -c hello.s-o hello.o
第四阶段
在链接阶段,将输入的二进制机器代码文件*.o(与其他机器代码文件和库文件)汇集成一个可执行的二进制代码文件。
4. 生成可执行文件
$ gcc hello.o -o hello
总结版:
对应以上四个阶段,直接一个命令
gcc hello.c -o hello