void 不能代表一个真实的变量,因为定义变量必须分配内存空间。
return return不能指向"栈内存"的"指针",因为该内存在函数体结束时被自动销毁。
return; 返回的是什么呢?
const 命名被替换为 readonly 或许更好。
修饰只读变量;节省空间,避免不必要的内存分配,同时提高效率(编译器通常不为普通const只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为编译期
间的值,没有了存储与读内存的操作,使得它的效率也很高。const只给出了相应的内存地址,而define给出的是立即数,所以const定义的只读变量在程序运行过程中只
有一份备份(因为它是全局的只读变量,存放在静态区),而define定义的宏常量在内存中有若干个备份。define宏是在预编译阶段进行替换,而const修饰的只读变量是在
编译的时候确定其值。define没有类型,而const修饰的只读变量具有特定的类型。
修饰一般变量,一般变量是指简单类型的只读变量。 int const i = 2; or const int i = 2;
修饰数组,int const a[5] = { 1,2,3,4,5 }; 或者 const int a[ 5 ] = { 1,2,3,4,5 };
修饰指针,const int*p ; // p可变,p指向的对象不可变
int const*p ; // p可变, p指向的对象不可变
int *const p; // p不可变,p指向的对象可变
const int *const p; // p不可变,p指向的对象也不可变
修饰函数的参数 void Fun( const int i ); i在函数体中不能改变
修饰函数的返回值,返回值不可变,const int Fun( void );
在另一链接文件中引用const只读变量: extern const int i ; //声明
volatile volatile是易变的、不稳定的意思。volatile和 const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、其他线程等。
遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问(比如寄存器变量,表示一个端口数据或者多个线程的
共享数据)。
extern extern 可以置于变量或函数前,以表明变量或函数的定义在别的文件中。
struct 空结构体多大?一个struct就是一个模子,模子大小不会为0,sizeof(empty class) = 1(字节)
柔性数组( flexible array )。C99中,结构中的最后一个元素允许是未知大小的数组,这就叫柔性数组成员,但结构体中的柔性数组成员前面必须至少有一个其他成员。
柔性数组允许结构中包含一个大小可变的数组。sizeof()的时候,不包括柔性数组的内存。
union 与struct用法类似。union所有数据成员具有形同的起始地址,默认属性是public。
大小端模式对union类型数据的影响。
大端模式:字数据的高字节存储在低地址中 ,而字数据的低字节则放在高地址中。
小端模式:字数据的高字节存储在高地址中 ,而字数据的低字节则放在低地址中。
如何用程序确认当前系统的存储模式:
int checkSystem() {
union check{
int i;
char ch;
}c;
c.i = 1;
return (c.ch==1); // 1 小端模式
}
enum 枚举类型,其实是个很有用的数据类型。
enum Color{
Green = 1,
Red ,
Blue = 10,
TT
}ColorVal;
Green = 1, Red = 2, Blue = 10, TT = 11
枚举与#define宏的区别
① define宏常量是在预编译阶段进行简单替换;枚举常量则是在编译的时候确定其值
② 一般在编译器里,可以 调试 枚举常量,但是不能 调试 宏常量
③ 枚举可以一次定义大量的相关的常量,而define一次只能定义一个
sizeof( Color ) = 4
typedef 给一个已经存在的数据类型(不是变量)取一个别名。
typedef struct s{
;
}Stu,*pStu;
const pStu stu_1; const 修饰的对象是 stu_1这个指针 ,因为把 pStu当成了一个整体,相当于 int
pStu const stu_2; 同上
符号
注释符号 int/*...*/i; 对的,空格代替了注释
char * s = "abcdefgh //hijklmn"; //在这里不是注释
//is it a\
valid comment?
上面两行是合法的注释,不过不建议那样写
in/****/t i; 这条注释是错的,被空格替换
/* */不能嵌套使用
y = x/*p;
/* 表示注释的开头,没有找到对应的 */, 所以会报错,不能表示 x 除以 p指向的内容, 要想表示,可以这样写, x/(*p) 或者 x/ *p;
接续符号和转义符
C语言里以反斜杠(\)表示断行,编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到钱一行。注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。
反斜杠还可以表示转义字符的开始标识。
单引号、双引号 1 '1' "1"
逻辑运算符 || 和 && 是我们经常用到的逻辑运算符,与按位运算符 "|" 和 "&"是两码事
位运算符 & | ^ ~(按位取反) << >>
0x01<<2+3 == 0x01<<5
++、--操作符
int i = 0;
for( i=0,printf("First = %d\n",i); printf("Second %d\n",i),i<10 ;i++,printf("Third = %d\n",i ) ) {
printf("Fourth = %d\n", i );
}
int i = 3;
return return不能指向"栈内存"的"指针",因为该内存在函数体结束时被自动销毁。
return; 返回的是什么呢?
const 命名被替换为 readonly 或许更好。
修饰只读变量;节省空间,避免不必要的内存分配,同时提高效率(编译器通常不为普通const只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为编译期
间的值,没有了存储与读内存的操作,使得它的效率也很高。const只给出了相应的内存地址,而define给出的是立即数,所以const定义的只读变量在程序运行过程中只
有一份备份(因为它是全局的只读变量,存放在静态区),而define定义的宏常量在内存中有若干个备份。define宏是在预编译阶段进行替换,而const修饰的只读变量是在
编译的时候确定其值。define没有类型,而const修饰的只读变量具有特定的类型。
修饰一般变量,一般变量是指简单类型的只读变量。 int const i = 2; or const int i = 2;
修饰数组,int const a[5] = { 1,2,3,4,5 }; 或者 const int a[ 5 ] = { 1,2,3,4,5 };
修饰指针,const int*p ; // p可变,p指向的对象不可变
int const*p ; // p可变, p指向的对象不可变
int *const p; // p不可变,p指向的对象可变
const int *const p; // p不可变,p指向的对象也不可变
修饰函数的参数 void Fun( const int i ); i在函数体中不能改变
修饰函数的返回值,返回值不可变,const int Fun( void );
在另一链接文件中引用const只读变量: extern const int i ; //声明
volatile volatile是易变的、不稳定的意思。volatile和 const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、其他线程等。
遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问(比如寄存器变量,表示一个端口数据或者多个线程的
共享数据)。
extern extern 可以置于变量或函数前,以表明变量或函数的定义在别的文件中。
struct 空结构体多大?一个struct就是一个模子,模子大小不会为0,sizeof(empty class) = 1(字节)
柔性数组( flexible array )。C99中,结构中的最后一个元素允许是未知大小的数组,这就叫柔性数组成员,但结构体中的柔性数组成员前面必须至少有一个其他成员。
柔性数组允许结构中包含一个大小可变的数组。sizeof()的时候,不包括柔性数组的内存。
union 与struct用法类似。union所有数据成员具有形同的起始地址,默认属性是public。
大小端模式对union类型数据的影响。
大端模式:字数据的高字节存储在低地址中 ,而字数据的低字节则放在高地址中。
小端模式:字数据的高字节存储在高地址中 ,而字数据的低字节则放在低地址中。
如何用程序确认当前系统的存储模式:
int checkSystem() {
union check{
int i;
char ch;
}c;
c.i = 1;
return (c.ch==1); // 1 小端模式
}
enum 枚举类型,其实是个很有用的数据类型。
enum Color{
Green = 1,
Red ,
Blue = 10,
TT
}ColorVal;
Green = 1, Red = 2, Blue = 10, TT = 11
枚举与#define宏的区别
① define宏常量是在预编译阶段进行简单替换;枚举常量则是在编译的时候确定其值
② 一般在编译器里,可以 调试 枚举常量,但是不能 调试 宏常量
③ 枚举可以一次定义大量的相关的常量,而define一次只能定义一个
sizeof( Color ) = 4
typedef 给一个已经存在的数据类型(不是变量)取一个别名。
typedef struct s{
;
}Stu,*pStu;
const pStu stu_1; const 修饰的对象是 stu_1这个指针 ,因为把 pStu当成了一个整体,相当于 int
pStu const stu_2; 同上
符号
注释符号 int/*...*/i; 对的,空格代替了注释
char * s = "abcdefgh //hijklmn"; //在这里不是注释
//is it a\
valid comment?
上面两行是合法的注释,不过不建议那样写
in/****/t i; 这条注释是错的,被空格替换
/* */不能嵌套使用
y = x/*p;
/* 表示注释的开头,没有找到对应的 */, 所以会报错,不能表示 x 除以 p指向的内容, 要想表示,可以这样写, x/(*p) 或者 x/ *p;
接续符号和转义符
C语言里以反斜杠(\)表示断行,编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到钱一行。注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。
反斜杠还可以表示转义字符的开始标识。
单引号、双引号 1 '1' "1"
逻辑运算符 || 和 && 是我们经常用到的逻辑运算符,与按位运算符 "|" 和 "&"是两码事
位运算符 & | ^ ~(按位取反) << >>
0x01<<2+3 == 0x01<<5
++、--操作符
int i = 0;
for( i=0,printf("First = %d\n",i); printf("Second %d\n",i),i<10 ;i++,printf("Third = %d\n",i ) ) {
printf("Fourth = %d\n", i );
}
int i = 3;