c笔试汇总1

#include "stdio.h"

int main()
{
 char *str = "AAA";
 printf("%s",str);
 str[0]='B';
 printf("%s",str);
return;
}

这段代码有什么问题?

str指向字符串常量,str[0]='B'对字符串常量进行赋值,当然会出现错误。

题目2

int (*a[10])(int)
为一个函数指针数组 每一个指针指向int func(int)类型函数

题目3

c和c++的struct有什么区别

当然 因为 c的struct不能有成员函数,而c++可以

题目4

void main()
{
      char str[10];
      printf("%d ",strlen(str));
}
输出结果未知:因为strlen和sizeof有大区别,strlen要判断字符串'\0',不同

题目5

#include "stdio.h"
#include "string.h"
typedef struct A
{
	char a:4;
	char b:4;
	unsigned short i:8;
	unsigned long m;
};
typedef struct B
{
	char a;
	char b;
	unsigned short i;
	unsigned long m;
};
typedef struct C
{
	char a;
	char b;
	unsigned short i;
	char c;
	unsigned long m;
};
int main()
{
 
 printf("%d\n",sizeof(struct A));
  printf("%d\n",sizeof(struct B));
   printf("%d\n",sizeof(struct C));
return;
}
输出结果是什么?

8  因为A结构体最大字节长度为4则4字节对齐

8

12 字节对齐

题目6

void wap(int *p1,int *p2)
{
	int *p;
	*p = *p1;
	*p1 = *p2;
	*p2 = *p;
	
}
错误  p为野指针没空间 怎么能够赋值呢?

题目7

十分非主流的一道题

要对绝对地址为0x100000赋值,我们可以用

(unsigned int *)0x100000 =1234

那么要让程序跳转到绝对地址是0x100000去执行,应该怎么做?

将0x100000强制转为函数指针 即(void (*)())0x100000

然后调用它 *(void (*)())0x100000

题目8

基础题

#include <file.h>和#include "file.h"

什么区别?

第一个从标准库目录查找file.h

第二个从用户工作目录查找file.h


题目9 堆栈溢出一般什么原因造成的?

没有回收资源

题目10

如何引用一个已经定义过的全局变量?

1 引用头文件

   如果变量写错,编译期间报错

2使用extern

  写错,编译期间不报错,但连接期间报错

题目11

用宏定义写出swap(x,y),交换两数

#define swap(x,y) (x) = (x)+(y);(y)=(x)-(y);(x)=(x)-(y);
或
#define mswap(x,y) (x) = (x)+(y);(y)=(x)-(y);(x)=(x)-(y)
题目12

int main()
{
 int a,b;
   a =3;
   b= 5;
   mswap(a,b);
   printf("a %d b %d\n",a,b);
return 1;
}
返回1什么作用,c标准认为返回0表成功 ,1其他为错误


题目13

预处理指令#define声明一个常数

#define SECOND(60*60*24*365)UL

题目14

C++调用被c编译器编译的函数 为什么要extern "C"

解决函数名字匹配

题目15

unsigned char *a;
unsigned long *b;
a = (unsigned char *)0x801000;
b = (unsigned long *)0x810000;
请问a+5=?

        b+5?

好题:a+5实际上是地址加 5字符长度,b+5增加5个长整型长度

为 0x801005

    0x810020

题目16

int main()
{
 int a,b;
 int m[5]={1,2,3,4,5};
 int *ptr = (int *)(&m+1);
 printf("m is %x \n",m);
 printf("m[0] is %x \n",&m[0]);
 printf("ptr is %x \n",&m);
 printf("ptr is ind %d %x \n",*(ptr-1),ptr);
   a =3;
   b= 5;
   mswap(a,b);
   printf("a %d b %d\n",a,b);
return 1;
}
这里主要注意 (int *)(&m+1);

实际是移动一个数组长度

题目17

#define SQ(a) ((a)*(a))

int a =5;

int b;

b = SQ(a++);

预编译会替换,有可能25 可能36

============================================================================

插入一个概念

函数原型就是使用一个函数前,对一个函数的预先的一个声明,说明下面要用到这样一个函数。函数原型一般由函数名、参数表、返回值类型组成。
函数原型不是必需的。如果你对这个函数的完整定义出现在使用这个函数之前,就不需要函数原型了。
char Get(int i)这样一个函数在使用时,就像这样调用:
c=Get(a);
其中a是预先定义好的一个int,然后函数执行时,a的值就是Get函数中的i,Get函数中return的值,就赋值给主调函数里的c
1. 在表达式中,char 和 short 类型的值,无论有符号还是无符号,都会自动转换成 int 或者 unsignedint(如果 short 的大小和 int 一样,unsigned short 的表示范围就大于 int,在这种情况下,unsignedshort 被转换成 unsigned int)。因为它们被转换成表示范围更大的类型,故而把这种转换称为“升级(promotion)”。

    2. 按照从高到低的顺序给各种数据类型分等级,依次为:long double, double, float, unsignedlong long, long long, unsigned long, long, unsigned int 和int。这里有一个小小的例外,如果 long 和 int 大小相同,则 unsigned int 的等级应位于 long 之上。char 和short 并没有出现于这个等级列表,是因为它们应该已经被升级成了 int 或者 unsigned int。

    3. 在任何涉及两种数据类型的操作中,它们之间等级较低的类型会被转换成等级较高的类型。

    4. 在赋值语句中,= 右边的值在赋予 =左边的变量之前,首先要将右边的值的数据类型转换成左边变量的类型。也就是说,左边变量是什么数据类型,右边的值就要转换成什么数据类型的值。这个过程可能导致右边的值的类型升级,也可能导致其类型降级(demotion)。所谓“降级”,是指等级较高的类型被转换成等级较低的类型。

    5. 作为参数传递给函数时,char 和 short 会被转换成 int,float 会被转换成 double。使用函数原型可以避免这种自动升级。

============================================================================

题目18

unsigned int a=6;

int b=-20;

(a+b>6)?puts(">6"):puts("<=6");

答案是

int 转unsigned 那么符号位将失去作用,因此结果>6




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值