1.长度和宽度
sizeof和strlen的区别
#include<stdio.h>
#include<string.h>
int main(){
char s[]="i love linux\0\0\0";
int a=sizeof(s);
int b=strlen(s);
printf("%d %d",a,b);
}
这个结果是16和12.其原因是sizeof比strlen多记录\0的数量。其中字符串原本自带了\0所以sizeof得到的a会比b多4.
2.箱子大小和装入物品的顺序
struct test1{
int a;
short b;
double c;
};
struct test2{
short b;
int a;
double c;
};
这两个是输出是相同的,都是16,这个考的是结构体对齐的问题,相关的知识点可以在我之前几年的题解中得到解释 。 第一个test1开始的int 占四个字节然后short占两个,因为八个算在一起所以不会移走,但double站八个字节所以只能挪走,所以是十六个字节,第二个test2相似
3.输出二维数组
#include<stdio.h>
#define M 3
#define N 2
int main(){
int **addOne(int a[M][N]);
int a[M][N]={{1,1},{2,2},{3,3}};
int i,j;
int **b = addOne((int **)a);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
printf("%d\t",*((int *)b+N*i+j));
}
int **addOne(int a[M][N]){
int **b =(int **)malloc(M*sizeof(int *));
for (int i=0;i<M;i++)
b[i]=(int *)malloc(N*sizeof(int));
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
*((int *)b+N*i+j) = *((int *)a+N*i+j) + 1;
return b;
}
4.
- 传值:传值,实际是把实参的值赋值给行参,相当于copy。那么对行参的修改,不会影响实参的值 。
- 传址: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参
可以看作定义一个a、b,*p、*p2,其中a、b与*p、*p2的地址空间是一样的,那么当*p1、*p2被修改时,a、b也会跟着发生变化,因为此时二者占用了同一块空间,当任意一者使空间里的内容发生变化时,二者都会做相同变化。
题目在曾经的博客中存在相似的题,就不再进行阐述了
5.
#include<stdio.h>
unsigned sum(unsigned n){return n?sum(n-1)+n:0;
}int main(){
printf("%u\n",sum(100));
}
表达式? 结果1:结果2
表达式返回true 返回结果1,否则返回结果2。
在这里是对1-100进行一个累加,即每次判断都会得到ture,所以会一直得到n-1的结果所以得到最后的结果便是对其累加
5050
void strbuf_rtrim(struct strbuf *sb); | 去除 sb 缓冲区左端的所有 空格,tab, '\t'。 |
void strbuf_ltrim(struct strbuf *sb); | 去除 sb 缓冲区右端的所有 空格,tab, '\t'。 |
void strbuf_remove(struct strbuf *sb, size_t pos, size_t len); | 删除 sb 缓冲区从 pos 坐标长度为 len 的内容。 |
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc 生成活动文件",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: /usr/bin/gcc"
}
]
}
void strbuf_rtrim(struct strbuf *sb); | 去除 sb 缓冲区左端的所有 空格,tab, '\t'。 |
void strbuf_ltrim(struct strbuf *sb); | 去除 sb 缓冲区右端的所有 空格,tab, '\t'。 |
void strbuf_remove(struct strbuf *sb, size_t pos, size_t len); | 删除 sb 缓冲区从 pos 坐标长度为 len 的内容 |