C语言动态内存管理
在C语言中,编写程序的时候不能确定内存的大小,希望程序在运行的过程中根据数据量的大小动态的分配内存。动态内存管理,就是指在程序运行过程中动态的申请和释放内存空间。
C语言允许程序动态管理内存,需要时随时开辟,不需要时随时释放。内存的动态管理是通过调用库函数来实现的,主要有malloc和free函数。
一、相关的库函数
1、malloc 函数
函数的原型:
1void *malloc(unsigned int size);
malloc的作用是向系统申请一块大小为size的连续内存空间,如果申请失败,函数返回0,如果申请成功,返回成功分配内存块的起始地址。
例如:
1malloc(100); // 申请 100 个字节的临时分配域,返回值为其第一个字节的地址
malloc的返回值的地址的基类型为void,即不指向任何类型的数据,只提供一个地址,程序中需要定义一个指针来指向动态分配的内存地址。
例如:
1int *pi=malloc(sizeof(int));
2、free 函数
函数的原型:
1void free(void *p);
free的作用是释放指针p指向的动态内存空间,p ...
C语言main函数的参数
程序运行的时候,有些需要带参数,有些不带参数,例如linux操作系统的命令,它们本质上就是C程序。
1)Linux命令中,无参数的不多。
12pwd #显示当前目录clear #清屏
2)大部Linux命令是带参数的。
1234cp book1.c book2.cmkdir /tmp/dnamemv book3 /tmp/dname/book3rm -rf /tmp/dname
各位现在是在C语言学习的初级阶段,编写的C程序非常简单,运行不需要参数,但是在实际开发中,main函数一般都需要参数,没有参数的情况极少。
main函数的参数是从命令提示符下执行程序的时候传入,例如ls 命令。
在以上示例中ls命令有两个参数,-l和book1?.c。
一、main函数的参数
main函数有三个参数,argc、argv和envp,它的标准写法如下:
1int main(int argc,char *argv[],char *envp[])
int argc,存放了命令行参数的个数。
char *argv[],是个字符串的数组,每个元素都是一个字符指针,指向一个字符串,即命令行中的每一个 ...
C语言格式化输出
一、格式化输出
格式化输出的函数有printf、sprintf和snprintf等,功能略有不同,使用方法大同小异,本章节我们先以printf为例。
对于 printf 函数,相信大家并不陌生。之所以称它为格式化输出函数,该函数的声名如下:
1int printf(const char *format, ...)
大家看到printf函数的声明就会有点懵,它参数的写法与我们之前学到的函数知识不一样,printf函数是一个“可变参数函数”(即函数参数的个数是可变的),可变参数函数的知识以后再介绍,现在只要知道怎么使用就行了。
printf函数的参数的个数和类型都是可变的,每一个参数的输出格式都有对应的格式说明符与之对应,从格式串的左端第1 个格式说明符对应第 1 个输出参数,第 2 个格式说明符对应第 2 个输出参数,第 3个格式说明符对应第 3 个输出参数,以此类推。
其中,格式说明符的形式如下(方括号 [] 中的项为可选项):
1%[flags][width][.prec] type
1、类型符(type)
它用以表示输出数据的类型,以下是常用类型的汇总,不常用的就不列了。
%h ...
C语言结构体
一、结构体的概念
前面的教程中我们讲解了变量和数组(array),变量是一个一个定义的,数组是一组具有相同类型的变量的集合。但在实际的工作和生活中,为了表达一个数据集,需要用不同数据类型的变量。例如超女基本信息,姓名为字符串,身高和年龄为整数,体重为浮点数,身材和颜值为字符串,因为数据集各要素的数据类型不同,不能用一个数组来存放。
用我们之前学过的知识,如果要存放超女信息,可以用多个变量,如下:
123456char name[51]; // 姓名int age; // 年龄int height; // 身高,单位:cmdouble weight; // 体重,单位:kgchar sc[31]; // 身材,火辣;普通;飞机场char yz[31]; // 颜值,漂亮;一般;歪瓜裂枣
这种方式有一个缺陷,如果某数据集有100个要素,就要定义100个变量,对100个变量初始化,把100个变量作为函数的参数传递,实在太麻烦。
在C语言中,使用结构体(struct)来存放一组不同类型的数据,语法如下:
12345678struct 结构 ...
C语言数据类型转换
计算机进行算术运算时,要求各操作数的类型具有相同的大小(存储位数)及存储方式,不能将char 型( 1 字节)数据与 int 型(2、4或8字节)数据直接参与运算;由于存储方式的不同,也不能将 int 型数据与 double 型数据直接参与运算。
然而,由于 C语言的灵活性,在一个表达式或一条语句中,允许不同类型的数据混合运算。
C语言的灵活性与计算机的机械性是一对矛盾,如处理不好,将会产生错误结果。对于某些类型的转换编译器可隐式地自动进行,不需程序员干预,称这种转换为自动类型转换;而有些类型转换需要程序员显式指定,这种类型转换称为强制类型转换。
一、自动类型转换
一个表达式中出现不同类型间的混合运算,较低类型将自动向较高类型转换。
不同数据类型之间的差别在于数据的取值范围和精度上,一般情况下,数据的取值范围越大、精度越高,其类型也越“高级”。
整型类型级别从低到高依次为:
signed char->unsigned char->short->unsigned short->int->unsigned int->long->unsigned ...
C语言字符串
在很多教程中,字符串不过是一个以0结束的字符数组,但是,在我看来,字符串虽然不是C语言基本数据类型,但它比任何数据类型都重要,因为字符串是最常用的数据。
一、字符串的概念
我们可以把字符串储存在char类型的数组中,如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串。
因为字符串需要用\0结尾,所以在定义字符串的时候,字符数组的长度要预留多一个字节用来存放\0,\0就是数字0。这是约定。
1char strname[21]; // 定义一个最多存放20个英文字符或十个中文的字符串
字符串也可以存放中文和全角的标点符号,一个中文字符占两个字节(GBK编码)。char strname[21]用于存放中文的时候,只能存10个汉字。
字符串采用双引号包含起来,如:“hello”、“中华人民共和国”、“A”、“”,这是约定。
二、占用内存的情况
一个字符占用一字节的内存,字符串定义时数组的大小就是字符串占用内存的大小。
12char str[21]; // 占用21字节的内存char str[1024]; // 占用1024字节的 ...
C语言浮点数
一、浮点数的概念
浮点数也称小数或实数。例如,0.0、75.0、4.023、0.27、-937.198 都是合法的小数。
C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。
在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内所有的值。
二、点用内存的情况
我们先来测试一下float、double和long double三种浮点数据类型占用内存的字节数。
示例(book71.c)
123456789101112/* * 程序名:book71.c,此程序测试float、double和long double占用内存的字节数 * 作者:C语言技术网(www.freecplus.net) 日期:20190525*/#include <stdio.h>int main(){ printf("sizeof float is %d\n",sizeof(float)); printf("sizeof d ...
C语言字符
在实际开发中,程序员很少用单个字符来表示数据,字符的意义主要作为数组的时候可以形成一个字符串。在本章节中,我们重点介绍字符与整数之间的关系和ASCII码的相关知识。
字符类型char,只能用单引号’ ‘来包围,不是用双引号" “包围。而字符串只能用双引号”
"包围,不能用单引号’ '包围。
输出字符使用 %c,输出字符串使用 %s。
一、ASCII码表
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码方案,它主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码方案,等同于国际标准ISO/IEC646。
ASCII码规范于1967年第一次发布,最后一次更新是在1986年,它包含了33个控制字符(具有特殊含义无法显示的字符)和95个可显示字符。
1、ASCII 控制字符 (字符编码: 0-31)
在ASCII码表中,前32个字符是不能用于打印的编码,而是用于控制像打印机一样的外围设备。
十进制
符号
中文解释
十进制
符号
中文解释
...
C语言整数
一、整数的概念
整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言使用int关键字来定义整数变量(int是 integer 的简写)。
在定义变量的时候,可以加signed、unsigned、short和long四种修饰符。
signed:有符号的,可以表示正数和负数。
unsigned:无符号的,只能表示正数,例如数组的下标、人的身高等。
short:短的,现在主流的64位操作系统下,整数占用内存4个字节,使用 4
个字节保存较小的整数绰绰有余,会空闲出两个字节来,这些字节就白白浪费掉了。在C语言被发明的早期,或者在单片机和嵌入式系统中,内存都是非常稀缺的资源,所有的程序都在尽可能节省内存。
long:长的,更长的整数。
二、整数的取值范围
整数的取值范围与计算机操作系统和C语言编译器有关,没有一个固定的数值,我们可以根据它占用的内存大小来推断它的取值范围。
一个字节有8个位,表示的数据的取值范围是28-1,即255。
如果占用的内存是两个字节,无符号型取值范围是28ⅹ28-1。
如果占用的内存是四个字节,无符号型取值范围是28ⅹ28ⅹ28ⅹ28-1。
如果占用的内 ...
C语言指针
一、变量的地址
内存变量简称变量,在C语言中,每定义一个变量,系统就会给变量分配一块内存,而内存是有地址的。如果把计算机的内存区域比喻成一个大宾馆,每块内存的地址就像宾馆房间的编号。
C语言采用运算符&来获取变量的地址。请看下面的示例。
示例(book50.c)
123456789101112131415161718/* * 程序名:book50.c,此程序用于演示获取变量的地址 * 作者:C语言技术网(www.freecplus.net) 日期:20190525*/#include <stdio.h> int main() { int ii=10; char cc='A'; double dd=100.56; printf("变量ii的地址是:%p\n",&ii); printf("变量cc的地址是:%p\n",&cc); printf("变量dd的地址是:%p\n",&dd); return 0;}
运行效果
...