20.共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
#include <stdio.h>
#include <string.h>union Data
{int i;float f;char str[20];
};int main( )
{union Data data; printf( "Memory size occupied by data : %d\n", sizeof(data));return 0;
}
21.指针
说到指针,就不可能脱离开内存,学会指针的人分为两种,一种是不了解内存模型,另外一种则是了解。
不了解的对指针的理解就停留在“指针就是变量的地址”这句话,会比较害怕使用指针,特别是各种高级操作。
而了解内存模型的则可以把指针用得炉火纯青!
想学好C语言,很关键就是搞懂内存、指针、还有各种编译链接,
内存本质
编程的本质其实就是操控数据,数据存放在内存中。
因此,如果能更好地理解内存的模型,以及 C 如何管理内存,就能对程序的工作原理洞若观火,从而使编程能力更上一层楼。
大家真的别认为这是空话,我大一整年都不敢用 C 写上千行的程序也很抗拒写 C。
因为一旦上千行,经常出现各种莫名其妙的内存错误,一不小心就发生了 coredump...... 而且还无从排查,分析不出原因。
相比之下,那时候最喜欢 Java,在 Java 里随便怎么写都不会发生类似的异常,顶多偶尔来个 NullPointerException,也是比较好排查的。
直到后来对内存和指针有了更加深刻的认识,才慢慢会用 C 写上千行的项目,也很少会再有内存问题了。(过于自信
「指针存储的是变量的内存地址」这句话应该任何讲 C 语言的书都会提到吧。
所以,要想彻底理解指针,首先要理解 C 语言中变量的存储本质,也就是内存。
#include <stdio.h>int main ()
{int var = 20; /* 实际变量的声明 */int *ip; /* 指针变量的声明 */ip = &var; /* 在指针变量中存储 var 的地址 */printf("Address of var variable: %p\n", &var );/* 在指针变量中存储的地址 */printf("Address stored in ip variable: %p\n", ip );/* 使用指针访问值 */printf("Value of *ip variable: %d\n", *ip );return 0;
}
22.文件读写
写入文件
#include <stdio.h>int main()
{FILE *fp = NULL;fp = fopen("/tmp/test.txt", "w+");fprintf(fp, "This is testing for fprintf...\n");fputs("This is testing for fputs...\n", fp);fclose(fp);
}
读取文件
#include <stdio.h>int main()
{FILE *fp = NULL;char buff[255];fp = fopen("/tmp/test.txt", "r");fscanf(fp, "%s", buff);printf("1: %s\n", buff );fgets(buff, 255, (FILE*)fp);printf("2: %s\n", buff );fgets(buff, 255, (FILE*)fp);printf("3: %s\n", buff );fclose(fp);}