9.执行下列程序段,并输入“Xiyou Linux”(不含引号),那么程序的输出结果是什么?请解释 其原因。
int main(int argc, char *argv[]) { char *p = (char *)malloc(sizeof(char) * 20), *q = p; scanf("%s %s", p, q); printf("%s %s\n", p, q); }
输出结果:Linux Linux
q指向的是p的地址,此过程相当于先将Xiyou给p,然后再通过地址找到p,将其修改为Linux
10.执行下面的程序段,每次执行的输出结果一致吗,整理并解释输出结果。
int main(int argc, char *argv[]) { int a[4] = { 2, 0, 1, 9 }; printf("%p, %p\n", a, &a); printf("%p, %p\n", a + 1, &a + 1); }
输出结果:0x7fffffffdb90, 0x7fffffffdb90
0x7fffffffdb94, 0x7fffffffdba0
分析:&a和a,一个表示整个数组的地址,一个表示首元素地址。
每次执行的结果是不一样的
11.斐波那契数列是这样的一串数列:1,1,2,3,5,8,13,......。在这串数列中,第一项、第二项为 1,其他项为前两项之和,该数列的第 x 项可以表示为下面的函数。请根据描述,写出一个程序,使之输入 x 后,能够输出斐波那契数列的第 x 项(其中 x<30)。当你完成之后,你可以尝试使用递归解决这个问题。
#include<stdio.h> int f(int n) { if (n <= 2) return 1;//当n=1,2时返回值为1,即f(0)=f(1)=f(2)=1 else return f(n - 1) + f(n - 2);//此时n>2,返回前两个数之和 } int main() { int n = 0; scanf("%d", &n); printf("%d\n", f(n)); return 0; }
12.下面代码段是某一种排序算法的简单实现,你知道它是什么吗?请讲解其原理,并尝试改进它。
int main(int argc, char *argv[]) { int nums[6] = {6, 3, 2, 4, 5, 1}; for (int i = 0; i < 6; i++) { for (int j = i; j < 6; j++) { if (nums[i] > nums[j]) { int c = nums[i]; nums[i] = nums[j]; nums[j] = c; } } } }
这是选择排序
优化思路:每次找出最小之值和最大值的下标,一次循环结束后再进行交换
int main(){ int len=sizeof(a)/sizeof(int); int t; /*初始化左端、右端元素下标*/ int left = 0; int right = len - 1; while (left < right){ /*初始化最小值、最大值元素的下标*/ int min = left; int max = right; for (int i = left; i <= right; i++){ /*标记每趟比较中最大值和最小值的元素对应的下标min、max*/ if (a[i] < a[min]) min = i; if (a[i] > a[max]) max = i; } /*最大值放在最右端*/ int t = a[max]; a[max] = a[right]; a[right] = t; /*此处是先排最大值的位置,所以得考虑最小值(a[min])在最大位置(right)的情况*/ if (min == right) min = max; /*最小值放在最左端*/ t = a[min]; a[min] = a[left]; a[left] = t; /*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/ left++; right--; } }
13.请简单叙述两种字节序(大端、小端)的概念,你的机器是什么字节序?试着写一个 C 语言程序来验证。
大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中(高位在前)
小端存储模式:是指数据的低位字节序保存在内存的低地址中,而数据的高位字节序保存在内存的高地址中(低位在前)
#include<stdio.h> int Check() { int i = 1; return (*((char*)&i)); //返回1表示小端 //返回0表示大端 } int main() { int c = Check(); if (1 == c) { printf("小端\n"); } else { printf("小端\n"); } return 0; }
14.以下是在某机器下执行 Linux 命令 ls 的部分输出(有删节),参考该输出,你可以说出哪些关于该命令以及其他 Linux的相关知识?
[root@xiyoulinux /]# ls -al total 36 drwxr-xr-x 17 root root 4096 Sep 21 23:45 . drwxr-xr-x 17 root root 4096 Sep 21 23:45 .. lrwxrwxrwx 1 root root 7 Aug 21 22:21 bin -> usr/bin drwxr-xr-x 4 root root 2048 Jan 1 1970 boot drwxr-xr-x 21 root root 3580 Nov 21 21:16 dev drwxr-xr-x 83 root root 4096 Nov 21 22:12 etc drwxr-xr-x 4 root root 4096 Sep 22 00:07 home drwxr-xr-x 2 root root 4096 Aug 21 22:21 mnt drwxr-x--- 9 root root 4096 Nov 19 19:15 root dr-xr-xr-x 13 root root 0 Nov 21 21:15 sys drwxrwxrwt 10 root root 380 Nov 21 22:30 tmp drwxr-xr-x 9 root root 4096 Nov 21 22:12 usr
该命令显示出指定目录下的内容(包括当前目录中文件及其子目录)。
-al 指查看设备是否具有读写权限。
第一列表示文件类型及权限
第二列表示链接数
第三列表示该文件所有者
第四列表示该文件所属群组
第五列表示文件大小(字节)
后面三列是该文件的最后修改时间
最后一列是文件名称