笔记——【C和指针】

17 篇文章 0 订阅
5 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值