c的小细节不定时总结

关于释放空间的小细节

1 for(p = head; p != NULL; p = p->next) //错误的代码段
2 free(p);
3 for(p = head; p != NULL; p = q) { //正确的代码段
4 q = p-next;
5 free(p);
6 }

 

多维数组int daytab[2][13]作为变元传递给函数f,则f的说明:f(int daytab[2][13])或f(int daytab[][13])或f(int (*daytab)[13]),见c程序设计语言P95

 

在求数组元素a[i]的值时,c语言是先将其转换为*(a+i)的形式软后再求值,因而在程序中这两种形式等价。当把取地址运算符&应用于这两种等价的形式时,尅知道&a[i]和a+i的含义也是相同的。如果pa是一个指针,那么表达式中可使用具有下标的指针pa,pa[i]与*(pa+i)的含义一样。但是,数组名和指针有区别,pa=a和pa++是合法的,但是a=pa和a++是非法的。此外,如果不越界的话,还有这样访问数组的pa[-1],pa[-2]……

 

static修饰外部变量或外部函数时,此变量或函数都只能在本源程序文件中使用。见《c程序设计语言》p69

static修饰内部变量时,此变量只能在本函数中使用,并且一直占据存储空间。

 

下面说一下宏定义(或称之为宏替换)的用法:
1) 形式:
#define 名字 替换文本
名字后可以接任意字符串,名字和define以及替换文本用空白字符分割。替换文本如果比较长,需要换行书写,那么需要在行尾加上\

2) 作用域:
从定义处到文件的结束

3) 带有变元的宏定义
一个最常见的例子是:
#define max(A,B) ((A) > (B) ? (A) : (B) ) // 带有变元
A,B
这里仅仅是一个替换,而不涉及到参数传递的问题,因此,绝对不能把
max() 看为一个函数,比如说:
max(i++,j);
这里i++只是单纯的被替换而已,所以,等同于:
i++ > j ? i++ : j
这样就做了2次加一运算
另外还可能出现的问题,比如
#define square(x) x*x
假如是square(i+2);
那么替换之后为 i+2*i+2,等价于 i + (2 * i) +2 ,结果显然和 (i +
2) * (i + 2) 不同

4) #变元 的含义
#define print(a) printf(#a);
这里#a 等价于 "a"。也就是说 #变元 被替换成为 "变元"
假如输入 print("a"),这里 " 被替换成为 \" , \ 替换成为 \\

5) ## 的含义
##表示连接,比如 a##b 就等价与 ab ,注意不是
"ab"(区别于#)
#define test(a) a##b; 这里先会替换a,再连接,比如 test(int),a##b
就等价与 inta

实例,编写一个swap宏,能够交换两个变量的值

 1 #include 
2 #define swap(Type,a,b) \
3 Type tmp##Type;\
4 tmp##Type = a;\
5 a = b;\
6 b = tmp##Type;
7
8 int main(){
9 int a = 1,b = 2;
10 swap(int,a,b);
11 char c = 'a',d = 'b';
12 swap(char,c,d);
13 printf("a = %d\nb = %d\n",a,b);
14 printf("c = %c\nd = %c\n",c,d);
15 return 0;
16 }

结果:
$ ./app
a = 2
b = 1
c = b
d = a

这里要注意的是:
1) 以下代码是无法通过编译的:

#define swap(Type,a,b) \
Type tmp;\
tmp##Type = a;\
a = b;\
b = tmp;

int main(){
int a = 1,b = 2;
swap(int,a,b);
char c = 'a',d = 'b';
swap(char,c,d);
printf("a = %d\nb = %d\n",a,b);
printf("c = %c\nd = %c\n",c,d);
return 0;
}

因为,swap会被替换两次,替换之后就会得到这样的语句:
int tmp;
char tmp;
这里明显的重复定义了。

因此,不论怎么样,一定要记住,宏定义仅仅是替换而已和函数不同

2) 因为是简单的替换,所以不用这样的调用方式:
swap(int,&a,&b); swap不是一个函数,没有形参和实参

posted @ 2012-03-21 20:05  Gwa  阅读(160)  评论(0编辑  收藏  举报