码迷,mamicode.com
首页 > 编程语言 > 详细

C语言编程忠告

时间:2015-03-16 16:28:30      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:c语言   局部变量   struct   指针   编程   

  • 指针用于判断是否为空的正确方法if(NULL == p); if(NULL != p);
  •  Float类型变量与0的比较方法:

if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 为定义好的精度。

  • 一般情况下if语句中进行判断,值放在左边,变量放有点,这样可以有效防止把 == 写成 =
  • For循环的循环控制变量最好用半开半闭
技术分享
  •  Void* 类型可以被任何类型赋值;比如:
void *p1;
int *p2;
p1 = p2;

  • 但是反过来却不行,因为我们可以说男人和女人都是人,但不能说人是男人或女人。如果需要赋值必须强制转换。
void *p1;
int *p2;
p2 = p1;

提示“‘=‘ : cannot convert from ‘void *‘ to ‘int *‘”。

  • 当一个函数无参数时,必须为其加上void

因为在c++中同样的做法如果为无参函数传参会导致出错提示“‘fun‘ : function does not  take 1 parameters”。

  •  Void指针操作注意事项

千万小心又小心使用void 指针类型。

按照ANSI(American National Standards Institute)标准,不能对void 指针进行算法操作,

即下列操作都是不合法的:

void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误

ANSI 标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指

向数据类型大小的。也就是说必须知道内存目的地址的确切值。

  • Return返回注意事项

return 用来终止一个函数并返回其后面跟着的值。

return (Val);//此括号可以省略。但一般不省略,尤其在返回一个表达式的值时。

return 可以返回些什么东西呢?看下面例子:

char * Func(void)
{
    char str[30];
    …
    return str;
}

str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错 误。return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时

被自动销毁。

  • Const修饰只读变量
const intMax=100;
intArray[Max];

这里请在Visual C++6.0 里分别创建.c 文件和.cpp 文件测试一下。你会发现在.c 文件 中,编译器会提示出错,而在.cpp 文件中则顺利运行。为什么呢?我们知道定义一个 数组必须指定其元素的个数。这也从侧面证实在C 语言中,const 修饰的Max 仍然是 变量,只不过是只读属性罢了;而在C++里,扩展了const 的含义

const 修饰的只读变量不能用来作为定义数组的维数,

也不能放在case 关键字后面。

  •  出色的注释应该注意的地方

【规则2-5】对于全局数据(全局变量、常量定义等)必须要加注释。

【规则2-12】对变量的范围给出注释。

  • 结构体别名指针应该注意的地方

typedef struct student
{
    //code
}Stu_st,*Stu_pst;

C),const Stu_pst stu3;  const修饰的是指针本身,

D),Stu_pst const stu4; const修饰的是指针本身

Stu_pst 是“struct student

{ /*code*/} *”的别名, “struct student {/*code*/} *”是一个整体。对于编译器来说,只认为Stu_pst 是一个类型名,所以在解析的时候很自然的把“Stu_pst”这个数据类型名忽略掉。

  •  值得注意的优先级

技术分享

  • 注释先于预处理指令被处理
#define BSC //
#define BMC /*
#define EMC */
D),BSC my single-line comment
E),BMC my multi-line comment EMC
    D) E)均错误。

  • 指针数组和数组指针的内存布局

初学者总是分不出指针数组与数组指针的区别。其实很好理解:

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身

决定。它是“储存指针的数组”的简称。

数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,

至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

下面到底哪个是数组指针,哪个是指针数组呢:

A),int *p1[10];

B),int (*p2)[10];

每次上课问这个问题,总有弄不清楚的。这里需要明白一个符号之间的优先级问题。

“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *

修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个

指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,在这里“()”的优先级比

“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,

即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指

针,它指向一个包含10 个int 类型数据的数组,即数组指针。

  • 忠告:

1.c语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首 地址的指针。目的是:为了节省时间和空间,提高程序运行的效率,因为我们并不需要 整个数组的内容,可能只对其中的一个或者几个感兴趣。

2.同样的,函数的返回值也不能是一个数组,而只能是指针。这里要明确的一个概念就是: 函数本身是没有类型的,只有函数的返回值才有类型。

C语言编程忠告

标签:c语言   局部变量   struct   指针   编程   

原文地址:http://blog.csdn.net/qingzai_/article/details/44307189

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!