C primer plus 第四章总结

来源:互联网 发布:舰娘国服 知乎 编辑:程序博客网 时间:2024/05/16 08:49

 一、字符串

1. 字符串就是一个或者多个字符的序列.如“I love you!” ,双引号不是字符串的一部分,他们只是通知编译器其中包含了一个字符串,正如单引号标识这一个字符一样.

2.C没有为字符串定义专门的变量类型,而是把它存储在char 数组中.字符串存储在数组中1时,需要用空字符  \0  来标记字符串结束。空字符不是数字0,它是非打印字符,其ASCII码的值为0,该字符存在意味着数组的单元数必须至少要比存储的字符数多1 .

 3.字符串和字符:字符串常量"x"和字符常量不同,其中一个区别是'x'属于派生类型(char数组),而'x'属于基本类型(char),第二个区别是"x"实际上由两个字符('x'和'\0')组成.

二、strlen()函数

   strlen()函数以字符为单位给出字符串的长度。(sizeof运算符它是以字节为单位给出数据的大小).


三、常量和预处理

 C提供了两种建立常量的方法,第一种是预处理,C预处理器允许定义常量。格式如:#define  NAME  value   NAME是常量的符号名,value是常量值,  没有使用分号是因为这是一种替代机制,而不是C的语句。符号常量名必须满足变量的命名规则,可以使用大写和小写字母、数字和下划线字符,第一个字符不能是数字。

  第二种是const修饰符,C中可以使用const关键字把一个变量声明转换成常量声明,如:

    const  int  MONTHS =12;  //MONTHS  是一个代表12的符号常量

  这就使MONTHS成为一个只读值,也就是说,您可以显示MONTHS,并把它用于计算中,但是您不能改变MONTHS的值。这个新方法比使用#define更灵活.


 const扩展:

const修饰符有以下优点:1.预编译指令只是対值进行简单的替换,不能进行类型检查

                                             2.可以保护被修饰的 东西,防止被修改,增强程序的健壮性

                                           3.编译器通常不为普通const常量分配存储空间,而是将他们保存在符号表中,这使它们成为一个编译期间的常量,没有了存储与读内存的操作,提高了                                           效率

以下自  http://blog.csdn.net/itxiebo/article/details/51206641#       转载

1、函数体内修饰局部变量。

例:

void func(){    const int a=0;}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量,我们给它赋予初始值0。

然后再看const.

const作为一个类型限定词,和int有相同的地位。

const int a;int const a;
  • 1
  • 2
  • 1
  • 2

是等价的。于是此处我们一定要清晰的明白,const修饰的对象是谁,是a,和int没有关系。const 要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值(l-value)。

这样的写法也是错误的。

const int a;a=0;
  • 1
  • 2
  • 1
  • 2

这是一个很常见的使用方式,如下:

const double pi=3.14;
  • 1
  • 1

在程序的后面如果企图对pi再次赋值或者修改就会出错。

然后看一个稍微复杂的例子。

const int* p;
  • 1
  • 1

还是先去掉const 修饰符号。 
注意,下面两个是等价的。

int* p;int *p;
  • 1
  • 2
  • 1
  • 2

其实我们想要说的是,*p是int类型。那么显然,p就是指向int的指针。 
同理

const int* p;
  • 1
  • 1

其实等价于

const int (*p);int const (*p);
  • 1
  • 2
  • 1
  • 2

即,*p是常量。也就是说,p指向的数据是常量。 
于是

p+=8; //合法*p=3; //非法,p指向的数据是常量。
  • 1
  • 2
  • 1
  • 2

那么如何声明一个自身是常量指针呢?方法是让const尽可能的靠近p;

int* const p;
  • 1
  • 1

const右面只有p,显然,它修饰的是p,说明p不可被更改。然后把const去掉,可以看出p是一个指向 int形式变量的指针。 
于是

p+=8; //非法*p=3; //合法
  • 1
  • 2
  • 1
  • 2

再看一个更复杂的例子,它是上面二者的综合

const int* const p;
  • 1
  • 1

说明p自己是常量,且p指向的变量也是常量。 
于是

p+=8; //非法*p=3; //非法
  • 1
  • 2
  • 1
  • 2

const 还有一个作用就是用于修饰常量静态字符串。 
例如:

const char* name=David;
  • 1
  • 1

如果没有const,我们可能会在后面有意无意的写name[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。

const 还可以用来修饰数组

const char s[]=David;
  • 与上面有类似的作用。
四、除了以上两种定义常量的方法,还有就是系统已经定义了的明显常量.C的头文件limits.h和float.h分别提供有关整数类型和浮点类型大小限制的详细信息

  

五、printf()和scanf()

printf()和scanf()被称为输出/输入函数,简称I/O函数,


原创粉丝点击