Xiyou linux 2017 面试题基本知识点

sizef

int main()
{
int t=4;
printf("%lu",sizeof(t–));
printf("%liiigviiilu",sizeof(“ab c\nt\012\xa1*2”));
return 0;
}

第一个pirntf语句里面即使t–,t也是个int型变量,输出的肯定是int类型所占的字节数;
第二个printf语句里面a b c 空格 \n t \012 \xa1 * 2 '\0’一共11个字符,所占字节为11个,此处,需要注意的就是\012是一个八进制数,\xa1是一个十六进制数,

printf

int main(int argc, char argv[])
{
int a = 10, b = 20, c = 30;
printf("%d %d\n", b = b
c, c = c*2) ;
printf("%d\n", printf("%d ", a+b+c));
return 0;
}

从右向左执行
先执行c=c2,所以c=60,再执行b=bc,所以b=1200
以第一行答案为:1200 60
printf("%d",a+b+c)的输出值为1270;
printf函数返回被打印的字符数,1270有4位,加上空格,所以返回值为5。

static

局部变量与静态局部变量
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
1.
普通局部变量:存储于栈中,使用完毕会立即释放
静态局部变量:存在内存的静态区

2.自动变量会随着函数被调用和退出而存在和消失,而静态局部变量不会,它不管其所在的函数是否被调用,都将一直存在

全局变量与静态全局变量
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围
1.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同

2.非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时。非静态的全局变量在各个源文件中都是有效的。
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
静态函数
static静态函数:使函数的作用域仅局限于本文件,即内部函数。

数组

代码1:

int main(int argc, char *argv[])
{
int a[][2] = {0, 0, 0, 0, 0, 0, 0, 0};
for(int i = 0; i <= 2; i++)
{
printf("%d\n", a[i][i]);
}
return 0;
}

第一个0是第一个,第二个0是第四个,第三个0是第六个。
二维数组值的确定
取某个元素时,是先通过计算这个元素的地址,再通过计算得来的地址取得该元素的。
设数组a[rows][cols](即有rows行,cols列),a[i][j]的地址为 a + i*cols + j。
a[0][0]的值为第一个
a[1][1]的值为第四个
a[2][2]的值 2乘2+2=6;

扫描二维码关注公众号,回复: 11886630 查看本文章

代码2:

int main(int argc, char *argv[])
{
int nums[5] = {2, 4, 6, 8, 10};
int *ptr = (int *)(&nums+1);
printf("%d, %d\n", *(nums+1), *(ptr-1));
return 0;
}

nums+1 为第二个元素的地址。
&nums+1 跳过了整个数组。ptr-1为数组最后一个元素的地址。

const

常用方式:

1.const int *p :*p指向的内容无法改变
2.int const *p:*p指向的内容不可改变
3.int * const p: *p不能改变指向,值可以变
4.const int *const p:即不改变指向也不改变内容

关键看const修饰的谁

#include<>与#include""

一、引用的头文件不同

#include< >引用的是编译器的类库路径里面的头文件。

#include“ ”引用的是你程序目录的相对路径中的头文件。

二、用法不同

#include< >用来包含标准头文件(例如stdio.h或stdlib.h).

#include“ ”用来包含非标准头文件。

三、调用文件的顺序不同
#include< >编译程序会先到标准函数库中调用文件。

#include“ ”编译程序会先从当前目录中调用文件。

四、预处理程序的指示不同

#include< >指示预处理程序到预定义的缺省路径下寻找文件。

#include“ ”指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。

注:博主也不理解。

指针问题

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);
}

这个程序在电脑上运行会出错
main函数里的指针str指向空,get函数中的malloc函数为指针pt分配空间,将str指针传进get函数,但要搞清楚,str指针依旧指向空,所以在strcpy函数中,字符串根本写不进去,这就解释了为什么电脑会报错

switch

int main()
{
int a,b=2,c=5;
for(a=1;a<4;a++)
{
switch(a)
{
b=99;
case 2:
printf(“c is %d\n”,c);
break;
default:
printf(“a is %d\n”,a);
case 1:
printf(“b is %d\n”,b);
break;
}
}
return 0;
}

输出:
b is 2
c is 5
a is 3
b is 2
在case前面的语句不执行

隐式转换

在表达式中如果有不同类型的数据参与同一运算时,编译器就在编译时自动按照规定的规则将其转换为相同的数据类型。 C语言规定的转换规则是由低级向高级转换。
char=short<int<unsingned<long=float<double

看代码

int main()
{
unsigned int a=10;
int b=-20;
if(a+b>0)
{
printf(“a+b=%d\n”,a+b);
}
else
{
printf(“a=%d,b=%d\n”,a,b);
}
return 0;
}

数字在计算机内部是以二进制补码进行运算的,int和unsigned int 一块运算时 先将-20转为为二进制,在求它的补码而无符号数的补码最高位不表示符号,所以一个负数表示为无符号数的时候他就会变成一个很大的正数,所以上题中的a在和b相加的时候b会变成一个很大的正数所以a+b就大于0了

标准输入与标准输出

int main()
{
while(1)
{
fprintf(stdout,“group”);
fprintf(stderr,“xiyoulinux”);
getchar();
}
return 0;
}

linux上是:xiyouLinuxgroup
windows上是:groupxiyoulinux
这是因为在linux下将group放在了缓冲区内,直到程序结束,才将缓冲区中的数据导出
而windows下不会
总结:
Linux:stderr不带缓冲,stdout带行缓冲–输出只有到换行的时候,才会输出到屏幕
Windows:stdout和stderr一样都是不缓冲的

字节截断问题

int main(int argc, char *argv[])
{
char str[512];
int i;
for (i = 0; i < 512; ++i)
{
str[i] = -1 - i;
}
printf("%lu\n", strlen(str));
return 0;
}

输出255

i为int型 4个字节。 char类型 一个字节。 会发生字节截断。
-256的二进制数为100…000100000000,char是一个字节,取后8位
所以当srt[255]=-256时,截取后8位,转换为十进制为0,那么根ASCII表,0所对应的为null,所以strlen读到null时就停止了,所以这个题的答案为255。

c语言从源程序到可执行程序

1.预编译:主要处理源代码文件中的以"#"开头的预编译指令,生成.i 文件
2.编译:将预编译之后生成的xxx.i文件,转换为汇编代码,生成.s文件
3.汇编:将汇编代码转换成机器可执行的机器代码,生成.o文件
4.链接:将有关的目标文件彼此相连接

猜你喜欢

转载自blog.csdn.net/weixin_45511599/article/details/104462258