/*******************************************************************************
——笔记
1. 函数申明的书写。
可以省略参数名称,只保留参数类型,但最好不要省略形参名称,他们常可以
向程序员传递一些有用的信息。
char * strcpy(char * dst, char * src); 2. const 易于被混淆的部分说明
const int limit = 10;
limit = 7; // [Error] assignment of read-only variable 'limit'
关键字 const 并不是将一个变量转换成一个常量,而是在一个变量前加一个限制
符,表示这个变量的值不能被修改。即 const 并不表示一个常量,可用 switch
语句验证,例如:
const int two = 2;
int i;
switch (i)
{
case 1:
case two: // integral constant expression expect
default:
;
} // 这是在书上说的,我使用Dev验证时没有报错。。。。。。。 int limit = 10;
const int * limitp = & limit;
int i = 27;
limitp = &i;
*limitp = 1; // [Error] assignment of read-only location '* limitp'
这段代码中 limitp 表示一个指向常量类型的指针,这个指针不能用于修改这个整
型的值,但指针本身的值可以改变 3. 使用无符号类型的建议
尽量不要使用无符号类型,以免增加不必要的复杂性。
只有在使用位段和二进制掩码时,才可以使用无符号数,应该在表达式中使用强制
类型转换,使操作数均为有符号数或无符号数,这样就不必由编译器来选择结果的
类型。 4. 字符串处理函数 strlen 求解结果不会包括一个用于存放 '\0' 的额外空间。
malloc(strlen(str)); 是错误的
malloc(strlen(str) + 1); 才是对的 5. C语言运算次序的问题
由于运算符的优先级与结和性的判断问题,最好按照程序员所需要运算步骤,牢
记 * \ 优先级高于 + - ,涉及其他运算符时一律加上括号()。 6. 变量的声明与类型的声明分开,便于增加代码的可读性
struct veg
{
int hah;
double heh;
char ch;
};
struct veg onion, pear; 7. 操作typedef
不要为了方便起见对结构体使用typedef,这样做的唯一好处是使你不必写struct关
健字,但这个关健字会向你提供一些提示信息,你不应该省略它。
typedef应该被用在:
数组,结构,指针以及函数的组合类型。
或者在可移植类型中,这样当把这段代码移植到不同平台时,要选择正确的类型时,
只需要在typedef中修改,无需对每个声明都加以修改。
typedef也可以为后面的强制类型转换提供一个简单的名字。 8. == 与 = 在判断语句中的使用
防止 == 与 = 因笔误导致的错误,在使用 == 号时,将常量放在左边,如果不小心
将 == 写生 = ,编译器会提示常量无法被赋值。 9. 使用define时宏名使用大写 10. int char 等关健字所修改的是它们右边紧邻的项目,而 const 和 volatile 类型
修饰符所修改的是它们左边紧邻的项目。 11. 使用 ?: 来表示简单的 if else 语句,这样可以简化代码,并且保持引用的局
部性。但是千万不要在一个条件操作符内嵌套另一个条件操作符。如果这样做,可能会
发现要想明白代码的确切意思变得十分困难。 12. 数组的声明就是数组,指针的声明就是指针,两者不能混淆。但在使用数组在表达
式中时,数组总是可以写成指针的形式,两者可以互换。
如:extren char a[]; 不能改成指针的形式。
数组和指针在编译器处理时是不同的,在运行时的表示形式也不一样,并可能产生不同
的代码。对编译器来言,一个数组就是一个地址,一个指针就是一个地址的地址。应该
根据实际情况作出选择。
在表达式中,它们是可以互换的,因为它们在编译器里的最终形式都是指针,并且都可
以进行取下标操作。
在下列情况下,对数组的引用不能使用指向该数组的第一个元素的指针代替
(1)数组作为sizeof()的操作数,显然此时需要的是整个数组的大小,而不是指向
第一个元素的指针的大小。
int arry[5];
int cnt = sizeof(arry); // 20
printf("cnt = %d\n", cnt);
int * p = arry;
int j = sizeof(p); // 8
printf("j = %d\n", j); (2)使用取地址操作符取数组的地址。
(3)数组是一个字符串常量初始值。 13. 数组名是一个不可修改的左值。 14. 数组的初始化
元素类型为int型 如果数组的长度比提供的初始值个数要大,剩余的元素会被初始化为0
float 为 0.0 指针类型为 NULL int arr1[5] = {1, 2};
float arr2[5] = {1.0, 2.0};
int i;
for (i = 0; i < 5; ++i)
{
printf("%-3d", arr1[i]);
}
printf("\n");
for (i = 0; i < 5; ++i)
{
printf("%f ", arr2[i]);
}
printf("\n");
int * arr3[5] = {&arr1[0], &arr1[1]};
if (NULL == arr3[2])
printf("NULL !\n"); 输出结果:
1 2 0 0 0
1.000000 2.000000 0.000000 0.000000 0.000000
NULL ! 15. 将字符串拷贝到字符数组时,定义的数组长度需要时strlen(string) + 1
字符串结尾为'\0'. ********************************************************************************/

最新文章

  1. Java 进阶 hello world! - 中级程序员之路
  2. 10个最常见的 HTML5 面试题及答案
  3. 从零开始学习jQuery (三) 管理jQuery包装集
  4. Discuz! X3.1直接进入云平台列表的方法
  5. pacman -Syu : key could not be looked up remotely.
  6. MsSql数据库存储过程加密解密
  7. ubuntu apt常用命令
  8. JavaScript——this、constructor、prototype
  9. 创建型模式(前引)简单工厂模式Simple Factory
  10. a标签属性说明
  11. 改变了一下blog的主题,很开心
  12. 花神的数论题(数位dp)
  13. toLocaleString
  14. PHP代码优化的53个细节
  15. bullet HashMap 内存紧密的哈希表
  16. windows下自动删除n天前的文件
  17. 【 VS 插件开发 】一、正确安装VS专业版
  18. Java 8新特性探究(八)精简的JRE详解
  19. codeforces675D
  20. Spring AOP 源码分析 - 拦截器链的执行过程

热门文章

  1. viewport移动端适配,读文笔记
  2. 如何使用MySQL一个表中的字段更新另一个表中字段
  3. 2. 更改InnoDB redo日志文件的数量或大小
  4. IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式
  5. ActiveMQ windows安装
  6. 关于java.io.FileNotFoundException: /static/count.txt (No such file or directory) 问题的解决
  7. 【模板】manacher算法
  8. POJ 2375 Cow Ski Area【tarjan】
  9. BZOJ3027 - [CEOI2004]Sweet
  10. 【分段哈希】H. Paint the Wall