首页 > 代码库 > c 深度剖析 2
c 深度剖析 2
1 while 等循环语句
1 break 和 continue的去别
2 将短的循环写在外面,长的写在里面;
3 循环嵌套尽量短
2 void
void *p,为空指针类型,可以指向任何的类型
若函数不接受参数,应写明 void,
3 return
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int *func( void ) { int a[2]={1,2}; return a; } void main() { int *b; b=func(); printf ( "%d \n" ,b[2]); } |
1 | main.c|6|warning: function returns address of local variable [enabled by default ]| |
return 不可访问栈内存中的指针,因为函数运行完后,内存自动销毁。
4 const
const 修饰的是 只读变量,而不是常量,不能用作数组的维数,不能用在case 后
const修饰的变量不允许这里修改不代表不允许别处修改,
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> void main() { int i = 5; const int * p = &i; //*p = 6; 不可以 *p为只读类型 i = 7; printf ( "i=%d \n" ,i); printf ( "*p=%d \n" ,*p); } |
5 volatile
被volatile 修饰的变量,不会被编译器优化,即每次用到的时候都会从原地址取值。
volatile可理解为“编译器警告指示字”
volatile用于告诉编译器必须每次去内存中取变量值
volatile主要修饰可能被多个线程访问的变量
volatile也可以修饰可能被未知因数更改的变量
const和volatile放在一起的意义在于:
(1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;
(2)另一个程序段则完全有可能修改,因此编译器最好不要做太激进的优化。
“const”含义是“请做为常量使用”,而并非“放心吧,那肯定是个常量”。
“volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。
因此,它们本来就不是矛盾的。
const volatile int i=10;这行代码有没有问题?如果没有,那 i 到底是什么 属性?
回答一:没有问题,例如只读的状态寄存器。它是volatile,因为它可能被意想不到地改变;它是const,因为程序不应该试图去修改它。volatile和const并不矛盾,只是控制的范围不一样,一个在程序本身之外,另一个是程序本身。
回答二:没问题,const和volatile这两个类型限定符不矛盾。const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误。volatile表示“易变的”,即在运行期对象可能在当前程序上下文的控制流以外被修改(例如多线程中被其它线程修改;对象所在的存储器可能被多个硬件设备随机修改等情况):被volatile修饰的对象,编译器不会对这个对象的操作进行优化。一个对象可以同时被const和volatile修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文意外的情况修改。另外,LS错误,const可以修饰左值,修饰的对象本身也可以作为左值(例如数组)。
6. struct
1 2 3 4 5 6 7 8 | #include <stdio.h> void main() { struct aa{}sa; printf ( "%d " , sizeof ( struct aa)); printf ( "%d " , sizeof (sa)); } |
书上说 Vc6.0中 空结构体 大小为1 ,但是GCC中空结构体大小为0;
7柔性数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> #include <stdlib.h> void main() { struct aa { int i; int a[]; }sa,*sb; sb= malloc ( sizeof (sa)+100* sizeof ( int )); sb->a[0]=1; sb->a[2]=3; printf ( "%d \n" , sizeof (sa)); printf ( "%d \n" ,sb->a[2]); free (sb); } |
1.结构中最后一个元素允许为柔性数组,a[]为柔性数组,之前必须至少有一个其他成员,
2 sb=
malloc
(
sizeof
(sa)+100*
sizeof
(
int
));给数组分配内存
?
8 enum
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <stdlib.h> void main() { enum ea { A=1, B=2, C=3, }eea; eea=A; printf ( "%d \n" ,eea); printf ( "%d \n" , sizeof (eea)); printf ( "%d \n" , sizeof ( enum ea)); } |