#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的值,就赋值给主调函数里的c1. 在表达式中,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