C学习第九天-重要知识点补充

typedef的用法

C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。

起别名的目的不是为了提高程序运行效率,而是为了编码方便。

例如有一个结构体的名字是stu,要想定义一个结构体变量就得这样写:

struct stu stu1;

struct看起来就是多余的,但不写又会报错。如果为struct stu起一个别名STU,书写起来就简单了:STU stu1;

这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。

使用关键字typedef可以为类型起一个新的别名。typedef的用法一般为:

typedef oldName newName;

需要强调的是,typedef 是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。

typedef和#define的区别

typedef在表现上有时候类似于#define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把typedef看成一种彻底的“封装”类型,声明之后不能再往里面增加新的东西。

1. 可以使用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。

2. 在连续定义几个变量的时候,typedef能够保证定义的所有变量均为同一类型,而#define则无法保证。

const的用法

可以使用const关键字对变量加以限定,使得变量的值不能被改变,在整个作用域中都保持固定。此时任何对此变量赋值的行为都将引发错误。const变量又被称为常量。

创建常量的格式通常为:

const type name = value; 

const和type都是用来修饰变量的,它们的位置可以互换,也就是将type放在const前面:

type const name = value; 

另外建议将常量名的首字母大写,以提醒程序员这是个常量。

由于常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值都将引发错误。一如既往,初始化常量可以使用任意形式的表达式。

const和指针

const也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据。

const和指针一起使用会有几种不同的顺序,如下所示:

const int *p1; 

int const *p2;

int * const p3;

在最后一种情况下,指针是只读的,也就是p3本身的值不能被修改;在前面两种情况下,指针所指向的数据是只读的,也就是p1、p2本身的值可以修改(指向不同的数据),但它们指向的数据不能被修改。

当然,指针本身和它指向的数据都有可能是只读的,下面的两种写法能够做到这一点:

const int * const p4;  

int const * const p5; 

const离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。

const和函数形参

在C语言中,单独定义const变量没有明显的优势,完全可以使用#define命令代替。const通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用const来限制。

const和非const类型转换

当一个指针变量str1被const限制时,并且类似const char *str1这种形式,说明指针指向的数据不能被修改;如果将str1赋值给另外一个未被const修饰的指针变量str2,就有可能发生危险。因为通过str1不能修改数据,而赋值后通过str2能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告。

也就是说,const char*和char*是不同的类型,不能将const char*类型的数据赋值给char*类型的变量。但反过来是可以的,编译器允许将char*类型的数据赋值给const char*类型的变量。

这种限制很容易理解,char*指向的数据有读取和写入权限,而const char*指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。

C语言标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非 const 类型的数据传递给 const 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将非 const 类型转换为 const 类型是允许的。

随机数生成

在C语言中,我们一般使用<stdlib.h>头文件中的rand()函数来生成随机数,它的用法为:

int rand(void); 

void表示不需要传递参数。

rand()会随机生成一个位于0~RAND_MAX之间的整数。

RAND_MAX是<stdlib.h>头文件中的一个宏,它用来指明rand()所能返回的随机数的最大值。C语言标准并没有规定RAND_MAX的具体数值,只是规定它的值至少为32767。

上一篇:Vagrant使用


下一篇:图解Go语言内存分配