第一章 关键字
声明和定义最重要的区别是:定义创建了对象并为对象分配了内存,声明没有分配内存(一个抱得美人归,一个坐着喝稀粥(难受))
C语言一共有32个关键字
1.1,auto 声明自动变量,缺省时编译器一般默认为auto
1.2,register 声明寄存器变量:
编译器尽可能的将变量存在CPU内部寄存器中
使用限制:register 变量必须是能被CPU寄存器所接受的类型。意味着register变量必须是一个单个值,并且其长度应小于或等于整形的长度。并且register变量可能不存放在内存中,所以不能用取地址浮“&”来获取register变量地址。因为寄存器寻址方式和内存寻址方式不同
1.3,static:修饰局部和全局变量,但它们都存在内存静态区
静态全局变量:作用域仅限于变量被定义的文件,准确的说在哪里定义直到文件结尾处结束(改变作用域)
静态局部变量:在函数体里定义,只能在本函数使用,即使这个函数运行结束,这个静态变量值还是不会销毁,函数下次使用依然存在(改变声明周期)
static修饰函数使函数成为静态函数(指对函数的作用域仅限于本文件)
1.8.2循环语句的注意点
在多重循环中,如果有可能应当将最长的循环放在最内层,最短的循环放在外层,用来减少CPU跨切循环层的次数
eg:
for(col=0;col<5;col++)
{
for(row=1;ROW<100;ROW++)
{
...
}
}
外循环进去一次,内循环执行100次
for(row=1;ROW<100;ROW++)
{
for(col=0;col<5;col++)
{
...
}
}
外循环进入一次,内循环执行五次,但外循环的切换100次
for循环再好采用半开半闭写法,更加直观
1.10 return
return;
这个语句在VS编译器下返回的是:-858993460
在Linux下返回的是:-1077946396
1.11const
1.11.1 const 修饰声明只读变量
const int Max = 10;
int Array[Max];
这条语句在.c文件中是会报错的,因为数组开始定义时就要指定元素的个数,是常量,所以也侧面说明const修饰是变量;
1.11.2节省空间,避免不必要的内存浪费,节省空间
const定义的只读变量在程序运行过程中,它只拷贝了一次(因为它是全局变量的只读,存放在静态区)而#define定义的宏常量在内存中有若干个拷贝,#define在预编译时进行替换,const修饰的只读变量是在编译是确定其值。
1.11.5修饰指针
const int *p//p可变,p指向的对象不可变
int *const p//p不可变,p指向的对象可变
const int *const p //p不可变,p指向的对象不可变
1.12,最易边的关键字-volatile
volatile 说明变量在程序执行中可被隐含地改变
主要作用是:保证特殊地址稳定的访问,防止被编译器未知的因素修改(比如:操作系统,其它线程,硬件),这样编译器就不会再优化代码了。
问题:const volatile int i=10;这行代码有没有问题?如果没有,那 i 到底是什么属性?
const和volatile放在一起的意义在于: (1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心; (2)另一个程序段则完全有可能修改,因此编译器最好不要做太过激进的优化(编译器爱优化)。
答:
没问题,const和volatile这两个类型限定符不矛盾。const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误。volatile表示“易变的”,即在运行期对象可能在当前程序上下文的控制流以外被修改(例如多线程中被其它线程修改;对象所在的存储器可能被多个硬件设备随机修改等情况):被volatile修饰的对象,编译器不会对这个对象的操作进行优化。一个对象可以同时被const和volatile修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文以外的情况修改。
1.15,union关键字
union用法和struct用法相似
在union中所有数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有的数据成员具有相同的地址,它的空间容量大小是数据成员中最大的长度
union StateM
{
char c;
int n;
char *str;
double exp;
};
所有StateM的空间大小就是double数据类型大小
union可以用来确定系统的存储模式(小端模式或大端模式)
#include<stdio.h>
union
{
int i;
char c;
}u;
int main()
{
u.i = 1;
if(u.c == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
1.16,enum 关键字
枚举的成员都是常量,如果没有赋值,默认它们的值都是从0开始依次递增。
eg:
enum Color
{
GREEN,
RED,
BLUE = 3,
BALCK,
WHITE = 10,
PINK
}ColorVal
其中各类常量代表的值分别为:
GREEN = 0
RED = 1
BLUE = 3,
BALCK = 4
WHITE = 10
PINK = 11
问题:计算一下sizeof(ColorVal)大小,为什么呢?
答:计算结果是4,因为枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是一样de