Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372502
  • 博文数量: 73
  • 博客积分: 3574
  • 博客等级: 中校
  • 技术积分: 1503
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-26 11:17
文章分类

全部博文(73)

文章存档

2012年(14)

2011年(15)

2010年(44)

分类: C/C++

2010-08-31 21:47:03

一些关于C语言中常用的知识点,看书的同时整理一下。
1)return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束的时候被自动销毁。 如果需要返回指针变量的话,需要在堆上位指针分配空间
2)const修饰的变量属性为只读,编译器通常不为普通const变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,效率较高。
   从汇编角度看,const定义的只读变量只是给出了对应的内存地址,而不是像#define一样给出立即数,所以,const定义的只读变量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干拷贝。
 
补充,const修饰的为只读变量,仍属于变量的意义,不是常量,不能用于定义数组的维数,也不能放在case关键字的后面
 
3)C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。
typedef struct st_type               typedef struct st_type
{                                    { 
  int i;                                int i;
  int a[0];                  或者        int a[];
}type_a;                              }type_a;
此时sizeof(type_a) = 4,0元素数组没有占用空间。
type_a *p = (type_a *)malloc(sizeof(type_a) + 100*sizeof(int));
此时即可通过p->item[n]访问变长的数组,注意此时sizeof(type_a) = 4.
4)union结构,用于字符大小端的判断与转换,一个很有技巧的方法。
5)int main()
   {
     int a[5] = {1,2,3,4,5};
     int *ptr1 = (int *)(&a + 1);
     int *ptr2 = ((int)a + 1);
     printf("%x,%x",ptr1[-1],*ptr2);
     return 0;
   }
   我感觉第一个语句打印5,第二个打印2,有待验证。。
 
   结论:第一个打印为5,正确,因为&a代表着指向一个包含5个元素的数组的指针,每次加1会加整个数组的长度。
   第二个打印为2000000,这个有点复杂,(int)a+1把a的地址加1,这里只是单纯的在数值上加1,即原来地址为0x00000001,现在地址为0x00000002,打印之后仍然按照int类型取4个字节求值打印,又涉及上字符排列的大小端,因此此时结果为2000000,证明电脑为小端存储方式,若为大端,结果应为00000100
 
6)typedef struct student
   {
    //code
   }stu_st,*stu_pst;
   此时,const stu_pst stu3,stu_pst const stu4,这里的const分别修饰哪个对象?
   答案貌似是都用来修饰指针而非对象本身,有待确认
 
结论:在考虑const修饰哪个变量时,编译器是这样做的,首先忽略类型名,之后const离哪个最近既是修饰哪个变量。在这里,stu_pst是struct student{..} *的别名,在做类型名的时候是一个整体,所以在解析的时候忽略到类型名,即可知const修饰的为指针
 
7) 还有一个比较长的题目,看了需要编代码测试了,测试后会把结果写到这里的。。
 
这个题目有点变态,暂时懒得动手,再议。。再议。。
阅读(1206) | 评论(0) | 转发(0) |
0

上一篇:工作感悟

下一篇:Linux魔术键

给主人留下些什么吧!~~