C语言小知识

来源:互联网 发布:淘宝店网址有说头吗 编辑:程序博客网 时间:2024/04/28 23:35

     .根据函数能否被其他的源文件调用,函数可以分为内部函数和外部函数两类:(1)内部函数:在函数的首部的最左端加关键字static,则表示此函数是内部函数。内部函数又称为静态函数,只能被它所在的文件中的函数调用,不能被其他的文件中的函数调用。(2)外部函数:在函数首部的最左端加关键字extern或者省略关键字,则表示此函数是外部函数。


     .作为一种特殊的变量,指针可以进行一些运算,但是并非所有的运算都是合理的,指针的运算主要局限在加减算数运算和其他一些为数不多的特殊运算符上。

(1)算数运算之“指针+整数”或者“指针-整数”。通俗的讲,“指针+整数”用于将指针向后移动“sizeof(指针类型)*整数”个内存单元,而指针-整数”用于将指针向前移动“sizeof(指针类型)*整数”个内存单元。

      注意:对指针的算数运算使的指针以某数值为单位在内存中前后移动,但是编辑器并不检查这种移动的有效性,即目的的地址是否可用。如果移动失误,很可能会修改一些本不该修改的内存单元,给程序带来致命后果。 

     因此,这种“指针和整数的加减运算”适宜在数组中进行,或者是动态申请的内存。

  (2)指针-指针

      指针变量所支持的另一种运算方式是两个同类型的指针相减,返回值是一个有符号的整数,其值可以用下列公式计算:(指针1的值-指针2的值)/指针所指向类型的占用的字节数。

    指针相减多应用于同一块内存(如数组或者一块动态申请的内存)中。如果两个指针所指向的元素没有任何结构上的关系,指针相减的结果将是不可预测的。

   规律:在数组中,在类型正确的前提下,若p1指向sz[i] ,p2指向sz[j],那么p1-p2=i-j;


    .指针与const

       const取自英文单词constant,是“恒定、不变”的意思,用户可以用其修饰变量和函数的参数列表和返回值,限定其不允许改变。使用const在一定程度上可以提高程序的健壮性。另外,在观看别人的代码的时候,清晰地理解const所起的作用,对理解程序也有一些帮助。

     使用const修饰指针时,通过在不同位置使用const,可以达到如下三个目的:

    (1)禁止对指针赋值。

    (2)禁止通过间接引用(*指针)对指针所指向的变量赋值。

    (3)既禁止对指针赋值,又禁止通过间接引用(*指针)对指针所指的变量赋值。

     1.禁止改写指针

     在声明一个指针时,如果在*右边加const修饰符,所声明的指针为常量指针(常指针),编译器不允许程序改写该指针的值。换言之,该指针恒指向某个内存地址,例如:int x=0;    int* const pInt=&x;

    上述代码声明了一个指向int形变量的指针pInt,并用int形变量X的地址为其初始化,在整个执行的过程中,pInt的值无法改变,也就是说,用户无法在后续代码中让pInt指向别的内存单元。

     注意:无法改写pInt的值并不意味着无法通过间接引用改写pInt所指向的变量。下述代码是合法的:

      x=5;*pInt=6;

     声明一个常指针,必须对其进行初始化,因为常指针的值在声明完毕后无法修改。因此,未进行初始化的常指针是没有意义的,编译器将给出错误提示。

    2.禁止改写间接引用

       在指针申明时,将const修饰符放在指针类型符之前,便无法通过间接引用改写指针所指向的变量。例如:

    int x=5; const int* pInt=&x;

       与常指针不同的是,此处的pInt并不被禁写,用户可以使用pInt指向其他的内存单元。但是,通过间接引用(*pInt)改写指针所指向的变量是非法的,例如:pInt=10.

      禁止写间接引用,并不意味着该内存单元无法改写,通过变量名访问和改写该内存区域是合法的。例如:X=10;

   

   四.typedef

C语言提供了一个自定义类型的语句-typedef,它能够为某一类型创建新的、方便的、可识别的名称。typedef和define相似,但typedef给出的符号名称仅限于对数据类型,而不是对值。

       typedef 原类型名 新类型名;


 

 

0 0