#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