C语言学习笔记(三)

1.函数形参求值顺序:

  int i = 2;

  max(i, i++);

  a.若顺序从左到右则为max(2, 2);

  b.若顺序从右到左则为max(3, 2);

  要写与求值顺序无关的函数。

2.函数值传递特点:

  a.形参与实参占有不同的内存单元;

  b.单向传递。

3.extern可以扩展函数的作用域,不管是在同一文件中还是在不同文件中。

4.const的用法:

  a.修饰函数参数,表明此参数不可更改

  b.修饰普通变量,表明此变量不可更改

  c.修饰指针变量,(分两种)

  example:

    (1)const int *p = &a; 等同于  int const *p = &a;

      代表指针p所指向的值不能被修改。

    (2)int* const p = &a;

      代表指针p不能被修改。

    区分方法:看"const"在"*"前面还是后面。

5.static的用法:

  a.限定变量的作用域

  b.设置变量的存储域

6.用联合体判断CPU是大端还是小端:

  int is_endian()

  {

    union A{

      int a;

      char b;

    }B;

    B.a = 0x01;

    printf("%d\n",B.b);

  }

 

7.数组和指针:

  a.分析char *a;

    (1)char * : 去掉了a, 变量的类型(指针)。

    (2)char :    去掉了*a, 指针所指向的类型。

  b.int *p1[10] (指针数组)

   int (*p2)[10] (数组指针,指向一个数组,每个数组元素都是int类型)。

  c.char a[5];

    (1)char (*p1)[5] = &a;(正确)

    (2)char (*p2)[5] = a;  (错误)

    (3)char *p = a;           (正确)

    这里a代表数组首元素的地址,即&a[0]。分清数组首元素地址和数组地址的分别。

  d.如果出现指针不兼容警告,那么指针的类型应该跟随左操作数。

8.变量的作用域:

  a.C编译器进行了优化:变量在没有使用之前是不分配内存的。比如两个文件中同时定义了全局变量int a;因为它们没有分配内存,所以在使用时不会出错。如果同时定义了int a = 1; int a = 2;那就错了。最好在全局变量前加上static。

  b.块变量:某个语句块运行时存在。

  c.静态局部变量具有全局生存期,但他的作用域还是函数作用域。

  d.所有静态存储区或全局存储区的变量若无显式赋值,则系统自动赋值为零。

 

你可能感兴趣的:(学习笔记)