C和指针第三章数据
- 字符串常量:
C语言中不存在字符串类型,但是C语言提供了字符串常量,字符串通常存储在字符数组中,并以NULL为结束字符。如果对一个字符串常量进行修改,其结果是未定义的,若想修改字符串,可以将它存储在数组中。在程序中使用字符串常量会生成一个指向字符串的常量指针。当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。因此,可以将字符串常量赋值给一个指向字符的指针,但是不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针。
- singed关键字:
signed关键字一般只用于char类型,因为其他类型在缺省情况下都是有符号的,至于char是否为singed,则因编译器而异。
- 变量的作用域和存储类型
变量的作用域有文件作用域,函数作用域,代码块作用域和原型作用域,变量的作用域和它的链接属性有关,链接属性有3种:internal(内部的)、external(外部的)、none(无)。
属于internal链接属性的标识符在同一个源文件内的所有声明中都指同一个实体,但位于不同源文件的多个声明则分别属于不同的实体,属于external链接属性的标识符不论何种情况都表示同一个实体。在缺省情况下,全局变量的链接属性为external。关键字extern和static用于在声明中改变标识符的链接属性。在external标识符前加static可以使它的链接属性变为internal,可以防止被其它源文件调用。
一个标识符指定extern链接属性,就可以访问在任何其它位置定义的这个实体,只有在第一次声明时才有效。
- 存储类型:
1)凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态变量。我们无法为它们指定其他存储类型。静态变量在程序运行之前创建,在程序的整个执行期间始终存在。始终保持原先的值,除非给他赋值一个不同的值或者程序结束。
2)在代码块内部声明的变量的缺省存储类型是自动的,也就是说它存储于堆栈中,成为自动变量。有个关键字auto就是用于修饰这种存储类型的,但它极少使用,因为代码块中的变量在缺省情况下就是自动变量。在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开代码块时,这些自动变量便自行销毁。如果该代码块被数次执行,这些自动变量每次都将重新创建。如果给变量加上static,可以使它的存储类型从自动变量变为静态。声明于函数内部的变量,在它前面加extern关键字将使它所引用的是全局变量,具有external链接属性,存储于静态内存中。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。
3)关键字register可以用于自动变量的声明,提示他们应该改存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。通常,寄存器变量比存储于内存的变量访问起来效率较高。寄存器变量的创建和销毁时间和自动变量相同,但需要一些额外的工作。寄存器先前存储的值必须恢复,确保调用者的寄存器变量未被破坏。
- static关键字
当它用于函数定义或者代码块之外的变量声明时,static关键字用于修改关键字的链接属性,从external改为internal,但存储类型和作用域无影响,用这种方式声明的函数或变量只能在声明她们的源文件中访问。
当它作用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修该为静态变量,但链接属性和作用域不受影响。
- 五种整型数据表:
char | 1 | -128---127 |
unsigned char | 1 | 0--255 |
short int | 2 | -32768--32767 |
unsigned short int | 2 | 0--65535 |
int | 4 | |
long int | 4 | |
long long int | 8 |