本博文为半摘记性质。
——
声明:知识点引自《全国计算机等级考试-上机考试新版题库 二级C》,部分例程修改自https://www.runoob.com/cprogramming/c-tutorial.html 菜鸟教程,另有部分零散资料转自互联网,内容有一定改动,并非全文转载。
本人尊重各位的知识成果,大幅引用的文章原文网址已在各小节末尾给出。
——
C语言在线运行工具:http://c.jsrun.net/
编译预处理
编译预处理不属于C语言语句的范畴,相当于一个文本替换过程。
常用预处理指令:
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#elif 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个 #if……#else 条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中
typedef
C语言允许用户自行定义类型说明符,即可以自行为原有的数据类型取别名(并没有生成新的数据类型),该功能是通过typedef实现的,其具体形式为:
typedef 系统已存在的数据类型 标识符
例:typedef unsigned char uchar;
可以对结构体使用 typedef 来定义一个新的数据类型名字,然后使用这个新的数据类型来直接定义结构变量:
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
int main( )
{
Book book = {“霞”,“佚名”,“文学”,“5874”};//此时的结构体成员赋值
...
}
对比:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} ;
int main( )
{
struct Books book = {...};
...
}
https://www.cnblogs.com/ktao/p/8578074.html typedef
1动态存储分配
动态内存分配指在程序运行中实时申请内存分配,通常用于预先不知道需要存储的文本长度的情况下;申请到的内存不用时必须及时释放,以防内存资源枯竭。
常见动态分配函数
1.malloc函数(常用)
void *malloc(unsigned int size);
函数类型为 void * 。
其功能为在内存的动态存储去中分配一个长度为size的连续存储空间(字节个数)。
函数返回值为一个指针,它指向所分配存储空间的起始地址。返回值为NULL时表示未能成功申请到内存空间。
malloc不能初始化所分配的内存空间。
2.calloc函数
void *calloc(unsigned int n,unsigned int size);
其功能为在内存的动态存储去中分配n个长度为size的连续存储空间(字节个数)。
函数返回值为一个指针,它指向所分配存储空间的起始地址。返回值为NULL时表示未能成功申请到内存空间。
calloc可将申请到的存储空间初始化为0,但这将降低效率。
3.realloc函数
void *realloc(void *ptr, int newsize);
该函数为ptr重新分配内存,把内存扩展到 newsize。
当扩大时,这块内存原先的内容会依旧保留,新添加的加入到原先的后面;缩小时,该内存的尾部部分内存去掉,剩余保留。
注意:如果ptr是NULL,此时 realloc 就相当于 malloc 函数;如果ptr不为NULL,size=0,那么 realloc 就相当于 free函数;如果 ptr 不为 NULL,那么 ptr 必须是之前 malloc,calloc,realloc 函数返回的指针,不能任意指定。
4.free函数
void free(void *ptr)
其功能为释放由指针变量ptr所指示的内存区域。ptr指向最近一次调用函数malloc或calloc时所分配的连续存储空间的首地址。
请注意:
1.由于内存分配并不总是成功,每次调用动态分配函数时需检查返回的指针值是否为NULL。
2. 动态内存使用后应及时释放。
3. 在具体使用中,可以将动态分配函数的返回值转换为特定指针类型,例如:
char *description = (char *)malloc( 30 * sizeof(char) );
案例
在这里,我们需要定义一个指针,该指针指向未定义所需内存大小的字符,后续再根据需求来分配内存,如下所示:
#include <stdlib.h>
int main()
{
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* 动态分配内存 */
description = (char *)malloc( 30 * sizeof(char) );
if( description == NULL )
{
fprintf(stderr, "Error - unable to allocate required memory\n");
}
else
{
strcpy( description, "Zara ali a DPS student.");
}
/* 假设您想要存储更大的描述信息 */
description = (char *) realloc( description, 100 * sizeof(char) );
if( description == NULL )
{
fprintf(stderr, "Error - unable to allocate required memory\n");
}
else
{
strcat( description, "She is in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
/* 使用 free() 函数释放内存 */
free(description);
}