2018
1.int main(int argc,char *argv[])
{
int nums[3][3] = {1,2,3,4,5,6,7,8,9};
printf("%d\n",nums[1][-2]);
printf("%d\n",(-1)[nums][5]);
printf("%d\n",-1[nums][5]);
return 0;
}
二维数组nums可以看作一个二级指针,其单个元素为一维数组,所以对数组的操作可以理解成对指针的操作。(-1)[nums][5]等价于nums[-1][5],
-1[nums][5]等价于-nums[1][5]。
2.
int main()
{
int a[3][2] = {2,0,1,8};
char *str = (char *)malloc(sizeof(char)*20);
strcpy(str,"\0101\\xb2");
printf("%zu\n",sizeof(a));
printf("%zu %d\n",sizeof(a[1][1] = 0),a[1][1]);
printf("%d\n",a[1][1]);
return 0;
}
sizeof作用是计算数据所占字节数,int型变量占4个字节,在第二个输出函数里,sizeof里面的赋值表达式并没有被执行,所以a[1][1]依然为8。
4.C语言代码编译成可执行程序经过以下四个步骤
- 预处理
宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除 - 编译
检查语法,将预处理后文件编译成汇编文件 - 汇编
将汇编文件生成目标文件(二进制文件) - 链接
C语言写的程序是需要依赖各种库的,所以编译之后还需要将库链接到最终的可执行程序中
int main(int argc, char *argv[])
{
int a[5];
printf("%p\n", a);
printf("%p\n", a+1);
printf("%p\n", &a);
}
7.整数类型主函数(整数类型 统计参数个数,字符类型*数组指针至字符[])
返回值为0表示程序正常执行完成。
8.
int f(unsigned int num);
{
for (unsigned int i = 0; num; i++)
num &= (num – 1);
return i;
}
作用是:如何判断一个数的二进制数中1的个数
9.
int main(int argc, char *argv[])
{
char n[] = { 1, 0, 0, 0 };
printf("%d\n", *(int *)n);
}
(int )n会将n强制转化为int类型,所以此时n=&n[0],输出为1。
10.
#define YEAR 2018
#define LEVELONE(x) "xiyoulinux"#x"\n"
#define LEVELTWO(x) LEVELONE(x)
#define MULTIPLY(x,y) x*y
int main(int argc, char *argv[])
{
int x = MULTIPLY(1+2,3);
printf("%d\n",x);
printf(LEVELONE(YEAR));
printf(LEVETWO(YEAR));
}
宏定义在执行时只会进行替换而非计算。
#在宏定义中 能将后面的参数字符串化。
11.
sizeof(st1) = 16 sizeof(st2) = 24
编译器在对结构体申请空间时要依据字节对齐原则。
12.
int main(int argc, char *argv[])
{
FILE *fp = fopen("Linux.txt", "wb");
long long a = 0x78756e694c;
fwrite(&a, sizeof(a), 1, fp);
fclose(fp);
}
文件内容是:Linux
程序会新建一个名为Linux的txt文件,并把a以二进制写入此文件中。
13.
typedef struct a {
char *name;
int num;
} A;
void func(A *a)
{
a = (A *)malloc(sizeof(A));
strcpy(a->name, "XiyouLinuxGroup");
a->num = 2018;
}
int main(int argc, char *argv[])
{
A *a;
func(a);
printf("%s %d\n", a->name, a→num);
}
应该把a = (A *)malloc(sizeof(A));放在main函数里面,因为指针只有初始化之后才能引用;应该把name改成字符数组,因为字符指针类型不可改写。
14.
#include<stdio.h>
int sum(char str[])
{
int i;
for(i=0;str[i]!='\0';i++)
;
return i;
}
int Convert(const char* num)
{
int m,i,s=0;
m=sum(num);
for(m,i=1;m>0;m--,i*=10)
s+=(num[m-1]-48)*i;
return s;
}
int main()
{
char str[10000];
int res;
scanf("%s",str);
res=Convert(str);
printf("%d",res);
}
#include<stdio.h>
#define fr for(i=0;i<m;i++)
int main()
{
int s1[10000],s2[10000];
int i,m,k,h;
scanf("%d",&m);
fr
scanf("%d",&s1[i]);
k=m-1;
h=0;
fr
{
if(s1[i]%2==1)
{
s2[h]=s1[i];
h++;
}
else
{
s2[k]=s1[i];
k--;
}
}
fr
s1[i]=s2[i];
fr
printf("%d ",s1[i]);
return 0;
}