西邮Linux兴趣小组2017纳新面试题总结
1
- main函数中带了两个参数,通常用
int argc, char *argv[])
来表示,这两个参数也可以不用使用,它们的意义分别是:第一个表示参数的个数;第二个参数中argv[0]为自身运行目录路径和程序名,argv[1]指向第一个参数、argv[2]指向第二个参数…… sizeof
是一个运算符,它的意义是计算出括号内内容所占字节数,数据类型是size_t
%lu
是32位无符号整数的格式控制字符\n
是转义字符,表示一个换行符,\012
是一个八进制数,表示八进制下的12;\xa1
是一个十六进制数,表示十六进制下的a1。转义字符都占了1个字节。- 输出结果第一行是int的字节数,也就是4;第二行是一个字符串所占的字节数,经计算是11(注意还有
\0
)。
2
- printf()函数在计算的时候顺序是从右往左的,但最后输出的顺序是从左往右的,因此第一个printf的结果是
1200 60
- 第二个printf函数里面还包含了一个函数printf,要先运行内部函数,输出
1270
,所以根据printf的返回值,外部的printf输出的结果是5。
3
- 形参和实参的区别,形参不占内存空间,因此不能使用malloc等函数为其赋予内存
- 不需要使用函数,直接
str = "Xiyou Linux Group"
即可。
4
- 通过指针调用函数
- 会先打印出字符串str,在计算strlen函数并打印其结果
5
- 对与全局变量来说,他们的存储方式相同,但是当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,而静态全局变量只在定义该变量的源文件内有效
- static局部变量只被初始化一次,下一次再经过初始化会直接跳过
- static函数和普通函数的作用域不同,只在当前源文件中使用的函数应该使用static来修饰,表示内部函数
6
- 在本程序中,其实
int a[][2]
就相当于int a[4][2]
- 所以for循环内的输出的是第一个、第四个、第七个0
7
- const关键字的作用是:被const修饰的变量将被视为只读,在初始化之后不能再被做任何修改
- 前两种方式结果一样,指针p所指向的空间不能再被修改
- 第三种是指针p的指向不能再被修改
- 最后一种是p的指向和指向的空间都不能再被修改
8
#include<>
是从系统的默认位置寻找文件,而#include""
内需要程序员写入文件路径,也就是一个字符串#include
作为预处理的一步,其意义是将所指文件中的所有内容拷贝到当前文件的该位置处,也就是我们平常在调用某些函数的时候,这样做就是对该函数有了声明和定义。- 在多文件中使用
#include
有助于使代码更加美观,增强可读性。
9
- 在switch的大括号内,赋值等语句不会被执行
- default代码块在switch中可有可无,甚至位置任意,但是要注意的是default后没有break照样会向下继续运行,所以结果是4行
10
- 结果会输出
a+b = -10
- 首先,在if判定时出现了a+b,也就是一个int型数据和unsigned int型数据进行相加,需要进行隐式类型转换(int转换成unsigned int),结果自然是大于0的
- 在进行输出时,由于使用了%d作为格式转换说明符,因此结果又应该从unsigned int转化成int。
11
- 输出结果是4,10
- 第一个4好理解,是
nums[1]
,即4 - 第二个10通过第二行的强制类型转换,将指针ptr指向了nums[4]的下一个4字节的地址,然后
*(ptr-1)
就是10了
12
- stdout是标准输出
- stderr是标准错误
- 两者都默认向屏幕输出
- 如果输出到文件,stdout就会正确的输出到文件,stderr会在屏幕
13
- char类型数据占了一个字节,范围是-128~127
- 在for循环中,str[0] = -1,str[1] = -2…以此类推,总会有str[x] = -128,则str[x+1] = 127,str[y] = 0,当这个数为0的时候,strlen不再继续向后计数
14
- 使用宏定义:
#define SWAP(x,y) ((x) = (x) + (y),(y) = (x) - (y),(x) = (x) - (y))
15
- 很明显在不同平台上a的值会相应地做出改变
- 此种方式的优点是可以大大增加代码的移植性,在不同的平台上都可以使用
17
- s占了8个字节,其中,a占了第一个字节、b占了第三第四个字节、c占了后四个字节
- 经过修改后,可以将s的内存数据用二进制表示出来:
0000 0011
0000 0000
0000 0000
0000 0101
0000 0000
0000 0000
0000 0000
0000 0111
- 但是要注意在个人计算机上内存往往使用的是小端存储的方式,因此实际上这个数据应该是这样的:
0000 0000
0000 0000
0000 0000
0000 0111
0000 0000
0000 0101
0000 0000
0000 0011
18
- 输出结果:
x1:ffff
x2:ffffffff
x3:ffffffff
__VA_ARGS__
是一个可变的宏,意义是宏定义中参数列表的最后一个参数为省略号##
运算符可用于宏函数的替换部分,这个运算符把两个语言符号组成了单个语言符号,为宏提供了一种连接多元的方式。