首页 > 代码库 > 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[]为柔性数组,之前必须至少有一个其他成员,

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));
}








来自为知笔记(Wiz)