2018题目

这篇博客探讨了C语言中的二维数组操作、sizeof运算符的用法、编译过程、函数参数统计、位操作以及结构体内存对齐等基础知识。还提到了文件操作和动态内存分配的注意事项。
摘要由CSDN通过智能技术生成

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语言代码编译成可执行程序经过以下四个步骤

  1. 预处理
    宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除
  2. 编译
    检查语法,将预处理后文件编译成汇编文件
  3. 汇编
    将汇编文件生成目标文件(二进制文件)
  4. 链接
    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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值