一些关于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) 还有一个比较长的题目,看了需要编代码测试了,测试后会把结果写到这里的。。
这个题目有点变态,暂时懒得动手,再议。。再议。。
阅读(1236) | 评论(0) | 转发(0) |