西邮Linux兴趣小组2021纳新面试题
#include<stdio.h>
#include<string.h>
int main(void)
{char s[]="I love Linux\0\0\0";int a=sizeof(s);//16int b=strlen(s);//12printf("a=%d b=%d\n",a,b);return 0;
}
sizeof是一个运算符,求的是数据类型所占空间的大小,即其所占内存空间的字节数;
strlen是一个函数,遇到/0就会结束,返回字符串的长度。
详情见:
strlen和sizeof的区别_飘过的小牛-CSDN博客_strlen和sizeof的区别
C语言中sizeof()和strlen()的区别_追梦的小蚂蚁-CSDN博客_sizeof和strlen在c语言的区别
相等(16)
根据内存对齐可知:
test1:a(int)从地址0开始占用0、1、2、3四个单元,b(short)占用4、5单元,c(double)内存对齐占用8、9、10、11、12、13、14、15单元,最后内存对齐补齐到16
test2:b同理占用0-1,a占用4-7,c占用8-15单元,补齐16
内存对齐参考:C/C++内存对齐详解 - 知乎
/*二维数组传参*/
void func(int a[][13], int m, int n);
void func(int (*a)[13], int m, int n);
void func(int **a, int m, int n);
#include<stdio.h>
int ver=123;
void func1(int ver)
{ver++;printf("ver=%d\n",ver);//1026
}void func2(int*pr)//传入ver的地址给指针pr
{*pr=1234;//在此函数内部修改pr指向地址中的值printf("*pr=%d\n",*pr);//1234pr=5678;//警告(直接把int型常量赋值给int*指针)/*printf("*pr=%d\n",*pr);/*pr指向的地址已经被修改,其值不确定*/printf("ver=%d\n",ver);//123(全局变量)
}int main()
{int a=0;//函数内部变量int ver=1025;for(int a=3;a<4;a++){static int a=5;//静态全局变量(仅在此循环中起作用)printf("a=%d\n",a);//5a=ver;printf("a=%d\n",a);//1025func1(ver);int ver=7;//仅在此循环中起作用printf("ver=%d\n",ver);//7func2(&ver);}printf("a=%d\tver=%d\n",a,ver);//0 1025(函数内部变量会覆盖全局变量)return 0;
}
#include<stdio.h>
unsigned sum(unsigned n)
{return n?sum(n-1)+n:0;/*利用递归当n不为0时不停返回sum(n-1)调用自己从而完成从1~100的累加*//*因为n为unsigned无符号整形,所以减到0后sum(n-1=0)+n=sum(0)+1=1,所以sum(0)=0,再逐层返回0+1+2+...+100=5050*/
}
int main()
{printf("sum=%d\n",sum(0));printf("%u\n",sum(100));//5050return 0;
}
#include<stdio.h>
void func(void);
int main()
{func();return 0;
}
void func(void)
{short a=-2;unsigned int b=1;b+=a;int c=-1;unsigned short d=c*256;c<<=4;//c的补码右移4位int e=2;/*优先级:取反 > 左移 > 按位与 > 按位异或 > 按位或*/e=~e|6;//取反 或运算(参加运算的两个对象只要有一个为1,其值为1),从左到右运算d=(d&0xff)+0x2022;//与运算(两位同时为“1”,结果才为“1”,否则为0)printf("a=0x%hx\t b=0x%x\t d=0x%hx\t e=0x%x\n",a,b,d,e);//十六进制输出(hx = short x)printf("c=0x%hhx\t\n",(signed char) c);//(hhx = short short x)
}
结果如下:
#include<stdio.h>
#define N 3
int main()
{int a[N][N]={{1,2,3},{4,5,6},{7,8,9}};int (*b)[N]=a;/* 数组指针(首先它是一个指针,它指向1个一维数组。在 64 位系统下永远是占 8 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称)*/++b;//b+1后指向a的第二行开头地址(就是{4,5,6}这一行),(*b)[0]=a[1](b此时为指向数组a第二行的数组指针)b[1][1]=10;//此时b[1]指a最后一行(也就是把a最后一行的第一个元素值变为10)int*ptr=(int*)(&a+1);//&a指向a整个数组的开头,+1指向下一个数组printf("%d %d %d\n",a[2][1],**(a+1),*(ptr-1));/*a[2][1]被改为了10(b[1][1]=10),**(a+1)表示对数组首元素+1得到第二个元素2(*(a+1)=2),后再对地址2处取值(*(2)=4)得到数组a第2行的首元素4,*(ptr-1)指整个数组的下一个数组减去一个元素地址得到上一个数组a的最后一个元素9*/return 0;//结果为10 4 9
}
a 是数组首元素的首地址,即a[0]的首地址。
&a 是数组的首地址。
a+1 是数组下一元素的首地址,即a[1]的首地址。
&a+1 是下一 个数组的首地址。
const int 和int const没有区别都是指此int类型的变量不能被修改
同理const int*和int const*也没有区别,都是指指针指向的值不能被改变
void func2(const int *n)//const在*n前表示不可修改指针n所指向的值
{*n+=1;//不能向只读形参赋值n=&a;
}
void func3(int*const n)//在n前表示不可修改指针n指向的地址
{*n+=1;n=&a;//不能向只读位置赋值
}
void func4(const int *const n)
{*n+=1;//不能向只读形参赋值n=&a;//不能向只读位置赋值
}
更多的const用法:
C语言中const关键字的用法_xingjiarong的专栏-CSDN博客_c const
const基本用法_灲咲的博客-CSDN博客_const的用法
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#define N 44
char *convert(const char *s);
int main()
{char *str="XiyouLinux Group 2022";char *temp=convert(str);puts(temp);return 0;
}
char *convert(const char *s)
{int len=strlen(s);char *k=(char*)malloc(N);//在函数中分配一段空间并且让指针k指向这段字符串的位置char *t=s;//指针t用来保存原字符串s的位置memset(k,0,N);//将新分配的内存空间中的数全部置为0char str[N];//用一个数组来存放转换后的字符串for(int i=0;*s!='\0';*s++,i++){if(*s>='a'&&*s<='z')str[i]=toupper(*s);else if(*s>='A'&&*s<='Z')str[i]=tolower(*s);else str[i]=*s;}strcpy(k,str);//将转换后的字符串存放进申请的新内存空间t=k;//使存放原s字符串的位置的指针改指向新的位置(新分配的内存空间)return t;
}
还可以不使用数组,通过指针的移动储存数据:
char *convert(const char *s)
{char *k=(char*)malloc(N);char *t=s;char *q=k;//再用一个指针保留新分配的内存地址memset(k,0,N);for(;*s!='\0';*s++,k++)//通过指针的移动将数据储存在新地址上{if(*s>='a'&&*s<='z')*k=toupper(*s);else if(*s>='A'&&*s<='Z')*k=tolower(*s);else*k=*s;}t=q;//让原指向s的指针指向新地址return t;
}
(1)前两种正确,第一种直接从原函数中传递参数,比较方便;第二种在参数中创建交换变量t,作用时间短,且占用内存空间小。第三种是错误的,只传递了a,b变量的值而并没有传递地址,所以仅在函数内部改变了a,b的值而函数作用完后就释放掉函数中变量的内存,a,b的值还是没有改变
(2)do{...}while(0)的用法_majianfei1023的专栏-CSDN博客_do while怎么用
(3)swap(a,b)值交换的四种方法:
void swap(int &a, int &b)
{
//方法一:int tmp = 0;tmp = b;b = a;a = tmp;
//方法二:a = a+b;b = a-b;a = a -b;
//方法三:a ^= b ^= a ^= b;
//方法四:a = a+b-(b=a);
}
当argv指针不为空的时候一直遍历:
#include<stdio.h>
#include<stdlib.h>
int *func1(void)
{static int n=0;//静态变量的作用时间是从调用它开始到本文件结束n=1;return &n;/*只能返回指针值也就是n的地址(此处可返回地址因为静态变量的值一直保存,且地址一直存在)*/
}
int *func2(void)
{int*p=(int*)malloc(sizeof(int));*p=3;return p;//返回指向新分配内存的首地址
}
/*3错误,现将3修改如下*/
int *func3(void)
{int *n;//不能设置为空指针否则赋值不了*(n)=4;//给指针指向这个随机地址赋值4return n;/*不可返回局部变量的地址(&n),作用完就被释放了,相当于返回一个野指针*/
}
int main(void)
{printf("%d\n",*func1());//1printf("%d\n",*func2());//3printf("%d\n",*func3());//4return 0;
}
关于static静态变量:c语言中static关键字用法详解_guotianqing的博客-CSDN博客_static
java:static--静态变量与普通变量的区别_yang_B621的博客-CSDN博客_静态变量
#include<stdio.h>
int main()
{int data[]={0x636c6557,0x20656d6f,0x78206f74,0x756f7969,0x6e694c20,0x67207875,0x70756f72,0x32303220,0x00000a31};puts((const char*)data);//Welcome to xiyou Linux group 2021/*相当于:0x57 0x65 0x6c 0x63 0x6f 0x6d 0x65 0x200x74 0x6f 0x200x78 0x69 0x79 0x6f 0x75 0x200x4c 0x69 0x6e 0x75 0x78 0x200x67 0x72 0x6f 0x75 0x70 0x200x32 0x30 0x32 0x31*/return 0;//大小端
}
关于大小端:字节序:大端法和小端法 - Broglie - 博客园
谈谈C语言从源文件变为可执行文件之间发生的过程详解(C程序的编译链接运行)_呋喃吖的博客-CSDN博客
关于堆栈的讲解(我见过的最经典的)_yingms的专栏-CSDN博客_堆栈
前提为,另一个文件中的函数,不能是静态函数,即不能有static修饰
调用方法:在调用前进行声明,然后直接调用即可
声明方法:如调用函数为int func(int a),那么在调用前只需要加上int func(int a);这样声明后,即可使用func。
#include<stdio.h>
int max(int x, int y);//调用前声明一下max函数
int main()
{int a = 13, b = 130;printf("%d\n",max(a, b));return 0;
}
int max(int x,int y)
{return (x>y?x:y);
}
在同一个project里面的源文件之间的函数一般情况下是可以互相调用的,前提是要声明以及不限制它的作用域
来源:c++在一个cpp文件中调用另一个cpp文件的函数的两种方法_lee_swift13的博客-CSDN博客_c++怎么调用另一个cpp中的函数c++工程里一个文件怎么调用另外一个文件里的函数_winder9898的博客-CSDN博客_c++调用另一个文件的函数
西邮Linux兴趣小组2019年面试题总结_TGRD4的博客-CSDN博客
西邮Linux兴趣小组2019补纳面试题总结_TGRD4的博客-CSDN博客
西邮Linux兴趣小组2020纳新面试题总结_TGRD4的博客-CSDN博客
西邮Linux兴趣小组2021纳新面试题相关推荐
- 西邮Linux兴趣小组2021纳新面试题题解
注: 本题目仅作西邮Linux兴趣小组2021纳新面试题的有限参考. 为节省版面本试题的程序源码中省略了#include指令. 本试题中的程序源码仅用于考察C语言基础,不应当作为C语言代码风格的范例. ...
- 西邮Linux兴趣小组2021纳新试题
1.大小和长度竟然不是一个意思, sizeof()和strlen()有什么异同之处? 他们对于不同参数的结果有什么不同?请试举例子说明. int main(void) { char s[] = &qu ...
- 西邮Linux兴趣小组2022纳新面试题题解
本题目只作为Xiyou Linux兴趣小组2022纳新面试的有限参考. 为节省版面,本试题的程序源码省去了#include指令. 本试题中的程序源码仅用于考察C语言基础,不应当作为C语言「代码风格」的 ...
- 西邮Linux兴趣小组2021纳新试题②
1. 结果:127 -128 signed char的范围是-128~127 unsigned char的范围是0~256 计算a-ch是把ch转换成整数,而输出ch是进行了类型转换为char类型,1 ...
- 西邮linux兴趣小组网络,西邮Linux兴趣小组2012纳新笔试题
这是我们西邮Linux兴趣小组2012的纳新笔试题,对于大一的学生,出得有难度哦,个人感觉比腾讯实习生的笔试题出的有水平. 西邮Linux兴趣小组纳新试题 姓名: ...
- 西邮Linux兴趣小组2017纳新免试题揭秘
声明 今年的免试题按照关卡顺序依次是由小组15级成员何攀.楚东方.宫展京.杜肖孟.王一妃同学精心准备的(鼓掌),每个人总结了一下自己负责关卡的解法,我这里整理了一下,给出一套完整的免试题详解,免试题通 ...
- 西邮 Linux 兴趣小组 2021 纳新试题
1. 请试着解释其输出 int main(int argc , char *argv[]) {unsigned char a = 255;char ch = 128;a -= ch;printf(&q ...
- [c语言]西邮Linux兴趣小组2020纳新面试题
一.运行下面的代码,输出结果是什么,解释原因. int i; int main(int argc, char *argv[]) {i--;if (i > sizeof(i)){printf(&q ...
- 西邮linux兴趣小组2014纳新免试题(四)
[第四关] 题目 http://findakey.sinaapp.com/ Example:String1:FFFF8 5080D D0807 9CBFC E4A04 24BC6 6C840 49B5 ...
最新文章
- 主流手机OS与鸿蒙OS
- 数据结构之【线性表】(顺序表、链表的基本操作实现)
- RESTful之自动生成接口文档
- python爬取历史上的今天数据并展示。
- A1087. 高精度加法
- [PE格式分析] 3.IMAGE_NT_HEADER
- android中有哪些utils的作用,AndroidUtils
- 十分钟上手 ES 2020 新特性
- 【对讲机的那点事】对讲机天馈系统关键元器件之功分器
- 20复变函数的积分(六)
- 代码检查技术Checkstyle与p3c调研
- 分享几个好用的WP插件,让你的网站牛逼起来
- 【2022 网鼎杯】青龙组 crypto WriteUp
- 基于核函数加权直方图的Mean Shift目标跟踪 (二维颜色直方图)
- MATLAB学习笔记(六)线性方程和线性系统
- 百趣代谢组学资讯:4篇经典案例助力科研不费力,均IF>12
- openjudge 二维数组右上坐下遍历(二维数组)
- java雪人程序_java的几种引用类型
- 使用MUlTISIM实现60进制计数器
- JavaScript之ES6语法
热门文章
- js 直接打开选择文件窗口_RPGMakerMV探秘01-文件结构
- 申万一级行业日指数_申万一级行业指数涨跌幅
- 工业超高频读写器|读取器CK-UR12-E02使用POE交换机和博途软件如何与西门子PLC配置解决方案
- OpenCore解决HD4600笔记本电脑hdmi输出
- 带随机种子的javascript随机函数
- opencv简单方式红绿灯状态识别
- 计算机中丢失hvdailt.dll,修复hvdailt.dll
- 得物商家客服桌面端Electron技术实践
- python文件.csv和.dta格式互转
- 【经验分享】Xshell如何修改复制粘贴快捷键