笔记——【C和指针】

来源:互联网 发布:java 读取tar.gz 编辑:程序博客网 时间:2024/06/01 10:29

1、函数指针数组

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);  //调用函数指针

2、字符串常量

P270
字符串常量出现于一个表达式中时,它的值是一个指针常量,指向第一个字符。
“xyz” + 1 == ‘y’
putchar(“0123456789ABCDEF”[value % 16]); //用来打印value对应的十六进制数

    strcpy("hello\n","bye\n");    printf("hello\n");  //将打印出bye

3、\40 \x40表示

\40 = 32 = 空格字符
\x40 = \100 000 = 64 = ‘@’

4、相同长度的无符号变量和有符号变量容纳的值谁大?

P48
一样。数在内存里都是以二进制存储的,只有在输出才分有符号和无符号。
而相同长度的int和float,int的精度更大。因为,浮点数有多种表示形式,float能表示的不同值的数量比int少。

5、指针比较大小

    char string[STRING_SIZE];    char *p = &string[0];    char *q = &string[用for循环找到最后一个元素];    while(p < q)

6、指针与数组

P168
一个文件中:

    int a[10];    int *b = a;

另一个文件:

    extern int *a;    extern int b[];    int x,y;    x = a[3];    y = b[3];

解释

7、数字转换为单词形式

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。你可以选择一种你喜欢的模式。

8、联合的初始化

P213
初始值必须是联合第一个成员的类型,而且必须位于一对花括号里面。

    union    {        int a;        float b;        char c[4];    }x = {5};     //把x.a初始化为5

9、结构体与地址

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型指针的大小。

10、用位运算代替位段

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位的都遗弃。

11、动态内存分配

当你一次请求500个字节的内存时,你实际获得的动态分配的内存数量总共有多大?
当你一次请求分配5000个字节又如何?它们有区别么?如果有,如何解释?
分析:分配内存是按4的倍数来分配的,这样有利于提高内存的读取速度,因为cpu是32位的话,一次可读取的内存就是32位,也就是4字节.如果你分配的内存不是4的倍数的时候,会比实际要求的多.

12

0 0
原创粉丝点击