C语言学习笔记

来源:互联网 发布:我的世界java更新 编辑:程序博客网 时间:2024/05/20 03:44

1.修改变量的存储类型并不表示修改该变量的作用域;
2.当extern关键字用于源文件中一个标识符的第一次声明时,它指定该标识符据有external链接属性。但是,如果它用于该标识符的第二次或以后的声明时,它并不会更改由第一次声明所指定的链接属性。

3. int const *pci  一个指向整形常量的指针, 可以修改指针的值,但不能修改它所指向的值
    int *const cpi  指向整形的常量指针,此时,指针是常量,他的值无法修改,但你可以修改它所指向的整型的值。

4.关键字register可以用于自动变量的声明,提示它们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。通常,寄存器变量比存储于内存的变量访问起来效率更高。

5.如果不显式的指定初始值,静态变量将初始化为0;

6.static
当它用于函数定义时,或用于代码块之外的变量声明时, static关键字用于修饰标识符的链接属性, 从external改为internal, 但标识符的存储类型和作用域不受影响.用这种方式声明的函数或变量只能在声明他们的源文件中访问.
当它用于代码块内部的变量声明时,static关键字用于修饰变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响.

7. 具有external链接属性的实体在其他语言的术语里称为全局实体,所有源文件中的所有函数均可以访问它

8.在while循环中可以使用break语句,用于永久终止循环.
  在while循环中也可以使用continue语句,它用于永久终止当前的那次循环.在执行万continue语句之后,执行流接下来就是重新测试表达式的值,决定是否继续执行循环.
  这两条语句的任何一条如果出现于嵌套的循环内部,它只对最内层的循环起作用, 你无法使用break或continue语句影响外层循环的执行.

9.通过一个指针访问它所指向的地址的过程称为间接访问或解引用指针。

10.指针变量和其它变量并无区别。如果变量是静态的,它会被初始化为0;但如果变量是自动的,它根本不会被初始化。

11.指针变量可以作为左值,并不是因为他们是指针,而是因为他们是变量。

12.*100 = 25;这是错的!这条语句实际上是非法的,因为字面值100的类型是整型,而间接访问操作只能作用于指针类型的表达式,如果你确实想把25存储于位置100,你必须使用强制类型转换。
*(int *)100 = 25;
这个技巧唯一有用之处是你偶尔需要通过地址访问内存中某个特定的位置,它并不是用于访问某个变量,而是访问硬件本身。

13.声明一个指针变量并不会自动分配任何内存。在对指针执行间接访问前,指针必需进行初始化;或者使他指向现有的内存,或者给他非陪动态内存。对未初始化的指针变量执行间接访问操作是非法的,而且这种错误常常难以检测。



14.用递归法计算n的阶乘;
long
factorial(int n)
{
    if (n <= 0)
    {
        return 1;
    }
    else
    {
        return n*factorial(n - 1);
    }
}



15./*用递归方法计算第n个斐波那契数的值。*/
long
fibonacci(int n)
{
    if (n <= 2)
    {
        return 1;
    }
    
    return fibonacci(n - 1) + fibonacci(n - 1);
}



16.可变参数列表
a.它不对参数的数量进行测试,无法检测到参数过多这种情况

17.当数组名作为sizeof操作符或单目操作符&的操作数时.sizeof返回整个数组的长度,而不是指向数组的指针的长度.
   取一个数组名的地址所产生的是一个指向数组的指针, 而不是一个指向某个指针常量值的指针.

18. 2[array] 和 *(array + 2)是对等的.

19.系统禁止编译器在一个结构的起始位置跳过几个字节来满足边界对齐要求,因此所有结构的起始存储位置必需是结构中边界要求最严格的数据类型所要求的位置.

20.C函数库提供了两个函数,malloc和free, 分别用于执行动态内存分配和释放(malloc从内存池中提取一块合适的内存,并向改程序返回一个指向这块内寸的指针,这块内存此时并没有以任何方式进行初始化).malloc返回一个类型为void*的指针.标准表示一个void*类型的指针可以转换为其它任何类型的指针.



21.calloc和realloc. calloc也用于分配内存.和malloc的主要区别是calloc返回指向内存的指针之前把它初始化为0.
   calloc参数包括所需元素的数量和每个元素的字节数.
   realloc函数用于修改一个原先分配的内存块的大小.

22.内存泄漏:当动态分配的内存不在需要使用时,它应该被释放,这样它以后可以被重新分配使用.分配内存但在使用完毕后不释放
将引起内存泄漏.

0 0