首页 > 其他 > 详细

c 深度剖析 2

时间:2014-05-03 23:17:20      阅读:499      评论:0      收藏:0      [点我收藏+]

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

bubuko.com,布布扣


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

bubuko.com,布布扣

书上说 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);
}

bubuko.com,布布扣

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


bubuko.com,布布扣








c 深度剖析 2,布布扣,bubuko.com

c 深度剖析 2

原文:http://www.cnblogs.com/chen-/p/3705109.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!