1.1 最宽宏大量的关键字--------auto(默认所有变量都是auto)
1.2最快的关键字------register
注意:register变量必须是单个值,长度小于或者小于整形长度。可能不错在内存中,不能用“&”地址。
1.3------static
1.静态全局变量:
2.静态局部变量:
(1)作用域只能在函数之内;
(2)被修饰的变量在内存静态取,即使函数运行结束,这个静态变量的值不会销毁
3修饰函数
#include <stdio.h>
#include <stdlib.h>
static int j;
void fun1(void){
static int i=0;
i++;
printf("i=%d\n",i);
}
void fun2(void){
j =0;
j++;
}
int main(int argc, char *argv[])
{
int k =0;
for(k=0; k<10; k++)
{
fun1();
fun2();
}
//printf("i=%d\n",i);
printf("j=%d\n",j);
return 0;
}
1.4 基本数据类型-----short,int,long,char,float,double
(1)禁止使用八进制的常数:
int code[2] ={052,35};
printf("%d\n",code[0]);
printf("%d\n",code[1]);
输出结果:42 35
(2)结构体定义一般加上结构体名
1.5 sizeof
1.5.1
int i = 1;
sizeof(int);
sizeof(i);
//sizeof int;
sizeof i;
***sizeof操作符一般在编译时求值,在C99中,计算法柔性数组所占空间大小,sizeof是在运行时求值,此为特例。
1.5.2 sizeof(int)*p
int *p = NULL;
printf("%d\n",sizeof(p)); //4
printf("%d\n",sizeof(*p)); //4
int a[100];
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[100])); //400
printf("%d\n",sizeof(&a)); //4
printf("%d\n",sizeof(&a[0])); //4
int b[100];
void fun(int b[100])
{
printf("%d\n",sizeof(b)); //4
}
1.6 signed ,unsigned 关键字
unsigned char 范围:0~255
signed char a[1000]; //范围【-128,127】
int i;
for(i=0;i<1000;i++)
a[i] = -1-i;
printf("%d\n",strlen(a));
输出结果为:255
补充知识:计算机系统中,数值一律用补码来表示(存储)。原因:
(1)使用补码可以将符号位和其他位统一处理;
(2)减法可以按加法处理。
(3)两个补码表示的数相加时,如果最高位有进位,则进位被舍弃,
问题
(1)
int i = -20;
unsigned j= 10;
printf("%d\n",i+j); //-10
(2)
unsigned i;
for(i=9; i>=0;i--)
printf("%u\n",i); //这是一个死循环
1.7 if,else组合
1.7.1 bool变量与“零值”进行比较
bool bTestFlag = FALSE;//这是什么?????
(1)if( bTestFlag ==0) //容易让人误会成整形变量
(2)if( bTestFlag ==TRUE); // 在编译器里,FLASE定义为0,但是true定义不一定为1
(3)if( bTestFlag ) // 最好写法
1.7.2 float变量与“零值”比较
[0.0-EPSINON,0.0+EPSINON]
1.7.3 指针变量与零值的比较
int *p =NULL;
if( p == 0) //容易产生误会,p是整形变量
if( p) //容易产生误会,p是bool类型值
if( NULL == p ) //建议写法
1.7.4 else 与 if 的匹配
1.8 switch ,case的组合
1.8。1
(1)每个case不要忘记break;
(2)最后有个default分支
(3)禁止使用return语句
1.8.2 case后面只能是整形或者字符型的常量表达式(字符型在内存中的存储方式)
1.8.3 case语句的排列顺序
(1)正常情况放在前面,异常情况放在后面。
(2)按执行频率排列case语句
1.9 do,while, for 关键字
1.9.1. break 和 continue的区别
Break:终止循环
Continue:终止本轮循环
1.9。2 循环语句注意点
(1)长循环在最内层效率最高(多层循环)
(2)for循环语句的控制表达式不能包任何浮点型的对象
1.10 goto关键字
1.11 void关键字------对函数返回的限定;对函数参数的限定
1.11.1 void a
void *p1;
int *p2;
p1 = p2;
p2 = p1; //cannot convert from ‘void *’ to ‘int *’
//有的编译器会提示上述错误,但是有的编译器不会提出错误
1.11.2 void修饰函数返回值和参数
fun()
{
return 1;
}
int main(int argc, char *argv[])
{
printf("%d\n",fun(2));
return 0;
}
输出结果:1 //这里要明白是以c的方式还是C++的编译方式
1.11.3 void指针
1.12 return 关键字 ---return语句不可返回指向“占内存”的“指针”,因为该内存在函数体结束时被自动销毁。
问题:return; //语句正确,返回值是1??????
1.13 const
1.13.1 const 修饰的是只读变量 ----------定义是必须初始化
const int Max = 10;
int Array[Max]; //.C文件中编译出错,只读属性,Max仍是变量,不是常量
const int Max = 10;
//int Array[Max]; //为什么这条语句是错误的
int *p = &Max;
*p = 9;
printf("%d\n",Max); //可以修改Max的值,仅仅有句警告
1.13.2
编译器通常不为普通的const只读变量分配空间,而是将他们保存在符号表中,这使得他们成为一个编译期间的值,没有存储和读内存的操作,于是效率也变高了。
1.13.3 修饰一般变量(一般变量的只读变量)
const int i = 2;
int const i = 2;
1.13.4 修饰数组 -- 只读数组
int const a[5] = {1,2,3,4,5};
const int a[5] = {1,2,3,4,5};
1.13.5 修饰指针
const int *p; //p可以变,p指向的对象不能改变
int const *p; //p可变,p指向的对象不可变
int *const p; //p不可变,p指向的对象可变
const int * const p; //指针p和p指向的对象都不可变
说明:先可以忽略类型名,看const离那个最近,就修饰谁
1.13.5 修饰函数参数------不希望这个参数值在函数体内被以为改变时使用
void fun(const int *p);
1.13.5 修饰函数的返回值--------返回值不可以被改变(C++进行了扩展)
const int Fun();
1.14 最易变得关键字------volatile
用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统,硬件和其他线程。
问题:
const volatile int i = 5; //没有问题
1.15---exterrn
1.16 struct关键字
1.16.1 空结构体多大----(一般认为内存大小是成员所占内存之和)
struct student
{
//int i;
}stu;
printf("%d\n",sizeof(stu)); //在DEV编译器输出为0
1.16.2 柔性数组
(1)C99中,结构体中的最后一个元素允许是未知的大小的数组,但是柔性数组成员,但是柔性数组成员前面必须至少有一个其他成员。
(2)柔性数组成员允许结构体中包含一个大小可变的数组。
(3)sizeof()返回的这种结构体大小不包含柔性数组的内存。
typedef struct st_type
{
int i;
int a[0];
}type_a;
int main(int argc, char *argv[])
{
printf("%d\n",sizeof(type_a));
type_a *p = (type_a *) malloc( sizeof(typa_a) + 100*sizeof(int));
return 0;
}
1.17 union
(1)Union维护足够的空间来放置多个数据成员中的“一种”,而不是每个数据成员配置空间。
(2)在union中所有的数据成员公用一个空间。同一时间只能存储一个数据成员。
(3)所有数据成员具有相同的起始地址
union StateMachine
{
char character;
int number;
char *str;
double exp;
};
说明;
(1)一个union只配置一个足够大的空间来容纳最大的数据成员。本例的最大长度就是double。
(2)在C++中,union默认类型为public类型。
(3)union主要用来压缩空间
(4)在一些数据中不可能在同一时间用到,就可以用union。
1.17.1 大小端模式对union类型的数据的影响
union
{
int i;
char a[2];
}*p,u;
p = &u;
p->a[0] = 'a';
p->a[1] = 'b';
存储模式:
大端模式:字数据的高字节存储在底地址中,而字数据的底字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而字数据的底字节存储在底地址中。
1.18 enum
1.18.1 枚举类型的使用方法
enum Color
{
ENUM_SONST_1, //1
ENUM_SONST_2, //2
ENUM_SONST_3, //3
ENUM_SONST_4 = 10, //10
ENUM_SONST_5, //11
}ColorVal;
1.18.2 枚举与宏的区别
(1)#define宏常量是在预编译是进行简单替换;枚举常量则是在编译的时候确定其值。
问题:
printf("%d\n",sizeof(ColorVal)); //输出为4
1.19 typedef关键字
1.19 typedef 与 #define 的区别
#define INT32 int
unsigned INT32 i= 10;
typedef int int32;
unsigned int32 j = 10; //编译出错
问题:
#define a int[10]
typedef int a[10]
这章看完了,发现自己还要好多知识的去学,学的太渣了