《C语言深度剖析》学习笔记--------第一章-----关键字

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 基本数据类型-----shortintlongcharfloatdouble

   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  sizeofint*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   ifelse组合

  1.7.1  bool变量与“零值”进行比较

     bool  bTestFlag = FALSE//这是什么?????

1if(  bTestFlag ==0)     //容易让人误会成整形变量

2if(  bTestFlag ==TRUE);  //       在编译器里,FLASE定义为0,但是true定义不一定为1

3if(  bTestFlag )              //    最好写法

1.7.2 float变量与“零值”比较

               [0.0-EPSINON,0.0+EPSINON]

1.7.3  指针变量与零值的比较

       int *p =NULL;

       if( p == 0)   //容易产生误会,p是整形变量

       if( p)       //容易产生误会,pbool类型值

       if( NULL == p )  //建议写法

1.7.4   else   if 的匹配

1.8 switch case的组合

1.81

   1)每个case不要忘记break

   2)最后有个default分支

   3)禁止使用return语句

1.8.2  case后面只能是整形或者字符型的常量表达式(字符型在内存中的存储方式)

1.8.3  case语句的排列顺序

1)正常情况放在前面,异常情况放在后面。

2)按执行频率排列case语句

1.9    dowhile for  关键字

1.9.1.  break  continue的区别

    Break:终止循环

   Continue:终止本轮循环

1.9循环语句注意点

   1)长循环在最内层效率最高(多层循环)

   2for循环语句的控制表达式不能包任何浮点型的对象

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;  //指针pp指向的对象都不可变

说明:先可以忽略类型名,看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  柔性数组

1C99中,结构体中的最后一个元素允许是未知的大小的数组,但是柔性数组成员,但是柔性数组成员前面必须至少有一个其他成员。

2柔性数组成员允许结构体中包含一个大小可变的数组。

3sizeof()返回的这种结构体大小不包含柔性数组的内存。

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

1Union维护足够的空间来放置多个数据成员中的“一种”,而不是每个数据成员配置空间。

 2)在union中所有的数据成员公用一个空间。同一时间只能存储一个数据成员。

3)所有数据成员具有相同的起始地址

union StateMachine

{

      char character;

      int number;

      char *str;

      double exp;

}

说明;

1)一个union只配置一个足够大的空间来容纳最大的数据成员。本例的最大长度就是double

2)在C++中,union默认类型为public类型。

3union主要用来压缩空间

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]

 

 这章看完了,发现自己还要好多知识的去学,学的太渣了大哭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值