P264
double add1(double, double);
double add2(double, double);
double add3(double, double);
double add4(double, double);
double (* fun[])(double, double) = //fun[]是一个数组,其中存放的是函数指针。
{
add1,
add2,
add3,
add4
};
result = fun[i](op1,op2); //调用函数指针
P270
字符串常量出现于一个表达式中时,它的值是一个指针常量,指向第一个字符。
“xyz” + 1 == ‘y’
putchar(“0123456789ABCDEF”[value % 16]); //用来打印value对应的十六进制数
strcpy("hello\n","bye\n");
printf("hello\n"); //将打印出bye
\40 = 32 = 空格字符
\x40 = \100 000 = 64 = ‘@’
P48
一样。数在内存里都是以二进制存储的,只有在输出才分有符号和无符号。
而相同长度的int和float,int的精度更大。因为,浮点数有多种表示形式,float能表示的不同值的数量比int少。
char string[STRING_SIZE];
char *p = &string[0];
char *q = &string[用for循环找到最后一个元素];
while(p < q)
P168
一个文件中:
int a[10];
int *b = a;
另一个文件:
extern int *a;
extern int b[];
int x,y;
x = a[3];
y = b[3];
解释
P139
题目如下:
编写函数void written_amount(unsigned int amount,char *buffer);
它把amount表示的值转换为单词形式,并储存于buffer中。这个函数可以在一个打印支票的程序中使用。例如,如果amount的值是16312,那么buffer中存储的字符串应该是
SIXTEEN THOUSAND THREE HUNDRED TWELVE
有些值可以用两种不同的方法进行打印,例如,1200可以是ONE THOUSAND TWO HUNDRED或TWELVE HUNDRED。你可以选择一种你喜欢的模式。
P213
初始值必须是联合第一个成员的类型,而且必须位于一对花括号里面。
union
{
int a;
float b;
char c[4];
}x = {5}; //把x.a初始化为5
P215 T7
typedef struct NODE
{
int a;
struct NODE * b;
struct NODE * c;
};
struct NODE nodes[5] =
{
{5, nodes+3, NULL},
{15, nodes+4, nodes+3},
{22, NULL, nodes+4},
{12, nodes+1, nodes},
{18, nodes+2, nodes+1}
}
nodes数组起始位置为200,整数和指针长度为4字节。
nodes[3].b->b 等价于:nodes[1].b == nodes+2 = 200 + 2*sizeof(NODE) = 200 + 2 * 12;
&nodes[3].a 等价于nodes[3]的起始地址,200 + 3*sizeof(NODE) = 200 + 3 * 12;
&nodes[3].c 等价于nodes[3]的起始位置偏移一个整形+一个NODE型指针的大小。
P216 T11
struct
{
int a:4;
int b:8;
int c:3;
int d:1;
}x;
x.a = aaa;
x.b = bbb;
x.c = ccc;
x.d = ddd;
首先定义一个整数int x
x &= 0x0FFF; //将需要设置的高4位先清零
x = (aaa & 0xF) << 12; //只获取aaa的低4位值,高于4位的都遗弃。
当你一次请求500个字节的内存时,你实际获得的动态分配的内存数量总共有多大?
当你一次请求分配5000个字节又如何?它们有区别么?如果有,如何解释?
分析:分配内存是按4的倍数来分配的,这样有利于提高内存的读取速度,因为cpu是32位的话,一次可读取的内存就是32位,也就是4字节.如果你分配的内存不是4的倍数的时候,会比实际要求的多.