本帖最后由 Minhal 于 2016-8-15 20:48 编辑
这里的1是第8章,7是第14章
[b]1 整数在计算机内部的存储方式[/b]重点:**** [b]1.1 原码[/b]将最高位做为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值 +7的原码是00000111 -7的原码是10000111 +0的原码是00000000 -0的原码是10000000 |
[b]1.2 反码[/b]一个数如果值为正,那么反码和原码相同 一个数如果为负,那么符号位为1,其他各位与原码相反 +7的反码00000111 -7的反码11111000 -0的反码11111111 |
[b]1.3 补码[/b]原码和反码都不利于计算机的运算,如:原码表示的7和-7相加,还需要判断符号位。 正数:原码,反码补码都相同 负数:最高位为1,其余各位原码取反,最后对整个数 + 1 -7的补码:= 10000111(原码) 111111000(反码) 11111001(补码) +0的补码为00000000 -0的补码也是00000000 |
补码符号位不动,其他位求反,最后整个数 + 1,得到原码 用补码进行运算,减法可以通过加法实现 | 7-6=1 7的补码和-6的补码相加:00000111 + 11111010 = 100000001 进位舍弃后,剩下的00000001就是1的补码 | -7+6 = -1 -7的补码和6的补码相加:11111001 + 00000110 = 11111111 11111111是-1的补码 |
[b]2 数组[/b]重点:** 内存连续,并且是同一种数据类型的变量,C语言的数组小标好是从0开始的,到n-1. [b]2.1 一维数组定义与使用[/b]类型 变量名称[数组元素的个数]; [b]2.2 数组在内存的存储方式[/b]在内存当中是连续的内存空间地址。 [b]2.3 一维数组初始化[/b]int array[10] = {0};//将数组所有元素都初始化为0 int array[10] = {0,1,2,3,4,5,6,7,8,9} 数组中找最大值思路 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADA7.tmp.jpg 数组中找第二大值思路 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADA8.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADA9.tmp.jpg 逆置数组思路 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADAA.tmp.jpg 测量楼宇高度的说明 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADAB.tmp.jpg 测量地球太阳距离的说明 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADAC.tmp.jpg 测量太阳木星距离的说明 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADBD.tmp.jpg [b]2.4 二维数组定义与使用[/b]int array[3][4];//12个元素的二维数组 [b]2.5 二维数组初始化[/b] int a[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; |
[b]3 字符串与字符数组[/b]重点:*** [b]3.1 字符数组定义[/b]char buf[100]; 对于C语言字符串其实就是一个最后一个元素为’\0’的char数组. [b]3.2 字符数组初始化[/b]char buf[] = “hello world”; [b]3.3 字符数组使用[/b] [b]3.4 随机数产生函数rand与srand[/b]头文件stdlib.h #include <time.h> int t = (int)time(NULL); srand(t); for (int i = 0; i < 10; i++) { printf("%d\n", rand()); } | |
[b]3.5 用scanf输入字符串[/b]char buf[100] = {0}; scanf(“%s”, buf); scanf("请输入i的值%d", &i); [b]3.6 字符串的结束标志[/b]file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADBE.tmp.jpg [b]3.7 字符串处理函数[/b][b]3.7.1 gets[/b]gets没有解决缓冲区溢出的问题. [b]3.7.2 fgets函数[/b]gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。 由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便 char s[100] = { 0 }; fgets(s, sizeof(s), stdin); |
[b]3.7.3 puts函数[/b]puts函数打印字符串,与printf不同,puts会在最后自动添加一个’\n’ char s[] = "hello world"; puts(s); |
[b]3.7.4 fputs函数[/b]fputs是puts的文件操作版本, char s[] = "hello world"; fputs(s, stdout); | [b]3.7.5 strlen,字符串长度[/b]strlen返回字符串的长度,但是不包含字符串结尾的’\0’ char buf[10] sizeof(buf);//返回的是数组buf一共占据了多少字节的内存空间. [b]3.7.6 strcat,字符串追加[/b]char str1[100]; char str2[100]; strcat(str1, str2);//把str2追加到str1的后面 str1一定要有足够的空间来放str2,不然会内存溢出. [b]3.7.7 strncat,字符串有限追加[/b]strncat(str1, str2, sizeof(str1) – strlen(str1) - 1); [b]3.7.8 strcmp,字符串比较[/b]strcmp(a, “str”);//如果两个参数所指的字符串内容相同,函数返回0 [b]3.7.9 strncmp,字符串有限比较[/b]strncmp(str, “exit”, 4); [b]3.7.10 strcpy字符串拷贝[/b]strcpy(str, “hello world”);//存在溢出的问题, [b]3.7.11 strncpy字符串有限拷贝[/b]strcpy(str, “hello world”, 7); [b]3.7.12 sprintf,格式化字符串[/b]printf是向屏幕输出一个字符串 sprintf是向char数组输出一个字符串,其他行为和printf一模一样 sprintf也存在缓冲区溢出的问题 [b]3.7.13 strchr查找字符[/b]strchr(str, ‘c’); 返回值是字符’c’在字符串str中的位置 [b]3.7.14 strstr查找子串[/b][b]3.7.15 strtok分割字符串[/b]字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL每次调用成功则返回指向被分割出片段的指针 char buf[] = "abc@defg@igk"; char *p = strtok(buf, "@");; while (p) { printf("%s\n", p); p = strtok(NULL, "@"); } |
[b]3.7.16 atoi转化为int[/b] [b]3.7.17 atof转化为float[/b] [b]3.7.18 atol转化为long[/b] file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADCE.tmp.jpg 作业说明: 不可以用任何已有的函数,完全自己写代码,完成十进制字符串转化为十进制的整数 作业思路: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADCF.tmp.jpg [b]4 函数[/b]重点*** [b]4.1 函数的原型和调用[/b]在使用函数前必须定义或者声明函数 double circle(double r); int main() { double length = circle(10); printf("length = %f\n", length); return 0; } double circle(double r) { return 2 * 3.14 * r; } |
[b]4.2 函数的形参与实参[/b]在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间需要传递数据。 在定义函数时函数名后面括弧中的变量名称为“形式参数”,简称形参。在调用函数时,函数名后面括号中的变量或表达式称为“实际参数”,简称实参。 1形参在未出现函数调用时,他们并不占用内存单元,只有在发生函数调用的时候形参才被分配内存,函数调用完成后,形参所占的内存被释放 2实参可以是变量,常量或者表达式 3在定义函数时,一定要指定形参的数据类型 4形参与实参的数据类型一定要可兼容 5在C语言中,实参与形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传递给实参。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADE0.tmp.jpg [b]4.3 函数的返回类型与返回值[/b]1函数的返回值通过函数中的return获得,如果函数的返回值为void可以不需要return语句。 2函数return语句中的返回值数据类型应该与函数定义时相同。 3如果函数中没有return语句,那么函数将返回一个不确定的值。 [b]4.4 main函数与exit函数[/b]在main函数当中遇到return语句,代表整个程序结束。在子函数当中遇到return代表子函数结束。 不论程序的任何位置调用exit函数,代表整个程序退出。 函数的学习难点是递归 [b]4.5 函数的递归[/b]函数可以调用自己,这就叫函数的递归 void recurse(int i) { if (i > 0) { recurse(i - 1); } printf("i = %d\n", i); } int main() { recurse(10); return 0; } |
[b]4.5.1 递归的过程分析[/b]void up_down(int n) { printf("in %d, location %p\n", n, &n); if (n < 4) up_down((n + 1)); printf("out %d, location %p\n", n, &n); } int main() { up_down(1); return 0; } |
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADE1.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADE2.tmp.jpg 有n个人排成一队,问第n个人多少岁,他回答比前面一个人大2岁,再问前面一个人多少岁,他回答比前面一个人大2岁,一直问到最后问第一个人,他回答10岁 int age(int n) { int i; if (n == 1) i = 10; else i = age(n - 1) + 2; return i; } |
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADE3.tmp.jpg 将10进制数转化为二进制数的例子 234在十进制下为2 * 10的2次方 + 3 * 10的1次方 + 4*10的0次方。 奇数的二进制最后一位一定是1,偶数的二进制最后一位一定是0。 可以通过 number % 2 得到二进制形式的最后一位,如果要将一个完整的整数转化为二进制就需要用到递归函数。 在递归调用之前,计算 number % 2的值,然后在递归调用语句之后进行输出,这样计算出的第一个数值反而在最后一个输出。 为了得出下一个数,需要把原数除以2,这种计算相当于十进制下把小数点左移一位,如果此时得出的数是偶数,,则下一个二进制的数值是0,如果得出的是奇数,那么下一个二进制数为1。 直到被2除的结果小于2,就停止递归。 void to_binary(unsigned int n) { unsigned int i = n % 2; if (n >= 2) to_binary(n / 2); printf("%c", i + 0x30); } |
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADF3.tmp.jpg 斐波那契数列例子 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 第0项是0,第1项是第一个1。 这个数列从第2项开始,每一项都等于前两项之和。 int fib(int n) { if (n == 0) return 0; if (n == 1) return 1; if (n > 1) return fib(n - 1) + fib(n - 2); } |
汉诺塔的例子 有三根针1,2,3。1针上有4个盘子,盘子大小不等,大的在下,小的在上, 要求把这4个盘子从1针一到3针,在移动过程中可以借助2针,每次只允许移动一个盘子,并且在移动过程中在三根针上都要保持大盘子在下,小盘子在上。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsADF4.tmp.jpg 可以分为以下步骤: 1、将1针上n-1个盘借助3针移动到2针上; 2、将1针上剩下的一个盘移动到3针上; 3、将n-1个盘从2针借助1针移动到3针上。 void hanoi(int n, int one, int two, int three) { if (n == 1) printf("%d->%d\n", one, three); else { hanoi(n - 1, one, three, two); printf("%d->%d\n", one, three); hanoi(n - 1, two, one, three); } } |
[b]4.5.2 递归的优点[/b]递归给某些编程问题提供了最简单的方法 [b]4.5.3 递归的缺点[/b]一个有缺陷的递归会很快耗尽计算机的资源,递归的程序难以理解和维护。 [b]4.6 多个源代码文件程序的编译[/b][b]4.6.1 头文件的使用[/b]如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型。 如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了。把函数声明放入头文件是很好的习惯。 [b]4.6.2 #include与#define的意义[/b] [b]4.6.3 #ifndef与#endif[/b] [b]4.7 函数的二进制封装[/b][b]4.7.1 exe加载dll的说明[/b]file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE05.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE06.tmp.jpg [b]4.7.2 动态库中代码与位置无关的说明图[/b]file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE07.tmp.jpg [b]4.7.3 linux编写so文件的方式[/b]1首先gcc编译的时候要加-fPIC选项,-fPIC是告诉gcc生成一个与位置无关的代码 2gcc链接的时候要加-shared选项,意思是生成一个so共享库。 对于linux或者unix,一个so文件,文件扩展名必须是so,文件名的前三个字母必须是lib [b]4.7.4 linux使用so[/b]gcc链接的时候需要加-L. 代表从当前目录下找相关的so文件,-l文件名(但不包括文件名开头的lib和扩展名so) 例如编译一个main.o文件,要用到当前目录下的liba.so库 gcc –o main.out –L. –la main.o [b]4.7.5 配置profile文件可以在当前目录下查找so文件[/b]linux不在当前目录下寻找可执行程序,同时也不早当前目录下找so库文件 修改用户配置文件的方法 1 cd 2 vi .bash_profile 3 export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:. 4 保存退出 5 . .bash_profile [b]4.8 作业描述[/b]int sum1(int n);//n = 10 0,1,2,3,4,5,6,7,8,9,10的和 要求不可以用循环,只可以用递归 int sum2(int n);//n = 10 从0到n范围内所有素数的和 要求不可以用循环,只可以用递归 [b]5 指针[/b]重点:***** [b]5.1 指针[/b][b]5.1.1 指针的概念[/b]指针也是一个变量,做为指针变量的值是另一个变量的地址。 指针存放的内容是一个地址,该地址指向一块内存空间 [b]5.1.2 指针变量的定义[/b]可以定义一个指向一个变量的指针变量。 int *p;//表示定义一个指针变量。 *p;//代表指针所指内存的实际数据 切记,指针变量只能存放地址,不能将一个int型变量直接赋值给一个指针。 int *p = 100; [b]5.1.3 NULL[/b]一个指向NULL的指针,我们称之为空指针,意味着这个指针不指向任何一个变量。 [b]5.1.4 野指针[/b]定义之后没有初始化值的指针 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE18.tmp.jpg [b]5.1.5 &取地址运算符[/b]file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE19.tmp.jpg [b]5.1.6 无类型指针[/b]定义一个指针变量,但不指定它指向具体哪种数据类型。可以通过强制转化将void *转化为其他类型指针,也可以用(void *)将其他类型指针强制转化为void类型指针。 void *p 在C语言当中,可以将任何一种地址赋值给void *指针 [b]5.1.7 指针的兼容性[/b]指针之间赋值比普通数据类型赋值检查更为严格,例如:不可以把一个double *赋值给int * [b]5.1.8 指针与数组的关系[/b]一个变量有地址,一个数组包含若干个元素,每个元素在内存中都有地址。 int a[10]; int *p = a; 比较p和&a[0]的地址是否相同 在C语言当中数组的名称代表数组的首地址,如果取数组名称的地址,C语言认为就是取数组的首地址。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE1A.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE1B.tmp.jpg [b]5.1.9 通过指针使用数组元素[/b]通过指针计算,不是把指针当做一个整数,计算结果,而是指针在内存当中移动 p + 1代表&a[1],也可以直接使用p[1]表示a[5] p + 5 代表&a[5] p++ 在C语言里面数组名称是个常量,值是不可改变的 [b]5.1.10 指针数组[/b]int *p[5]; file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE2B.tmp.jpg [b]5.1.11 数组指针[/b]int (*P)[5]; file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE2C.tmp.jpg [b]5.1.12 指向指针的指针(二级指针)[/b]指针就是一个变量,既然是变量就也存在内存地址,所以可以定义一个指向指针的指针。 int i = 10; int *p1 = &i; int **p2 = &p1; printf("%d\n", **p2); 以此类推可以定义3级甚至多级指针。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE2D.tmp.jpg [b]5.1.13 指针变量做为函数的参数[/b]函数的参数可以是指针类型。,它的作用是将一个变量的地址传送给另一个函数。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE2E.tmp.jpg [b]5.1.14 一维数组名作为函数参数[/b]当数组名作为函数参数时,C语言将数组名解释为指针 当数组名作为函数参数传递给被调用函数时,被调用函数是不知道数组有多少元素的 int func(int array[10]); 相当于传递是一个地址,那么就可以通过地址来修改实参的值。 只要传递是数组名,那么形参一定可以通过地址修改实参的值。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE2F.tmp.jpg [b]5.1.15 二维数组名作为函数参数[/b]二维数组做函数参数时可以不指定第一个下标。 int func(int array[][10]); [b]5.1.16 指向二维数组的指针[/b]int a[3][5] a | | | | | | | | a[1] + 2, *(a + 1) + 2, &a[1][2] | | *(a[1] + 2), *(*(a + 1) + 2), a[1][2] | |
[b]5.1.17 指向常量的指针与指针常量[/b]const char *p;//定义一个指向常量的指针 char *const p;//定义一个指针常量,一旦初始化之后其内容不可改变 [b]5.1.18 const关键字保护数组内容[/b]如果将一个数组做为函数的形参传递,那么数组内容可以在被调用函数内部修改,有时候不希望这样的事情发生,所以要对形参采用const参数 func(const int array[]) [b]5.1.19 指针做为函数的返回值[/b]char *func();//返回值为char *类型的函数 [b]5.1.20 指向函数的指针[/b]指针可以指向变量,数组,也可以指向一个函数。 一个函数在编译的时候会分配一个入口地址,这个入口地址就是函数的指针,函数名称就代表函数的入口地址。 函数指针的定义方式:int (*p)(int);//定义了一个指向int func(int n)类型函数地址的指针。 1定义函数指针变量的形式为:函数返回类型(*指针变量名称)(参数列表) 2函数可以通过函数指针调用 3int( * P)()代表指向一个函数,但不是固定哪一个函数。 void man() { printf("抽烟\n"); printf("喝酒\n"); printf("打牌\n"); } void woman() { printf("化妆\n"); printf("逛街\n"); printf("网购\n"); } int main() { void(*p)(); int i = 0; scanf("%d", &i); if (i == 0) p = man; else p = woman; p(); return 0; } |
[b]5.1.21 把指向函数的指针做为函数的参数[/b]将函数指针做为另一个函数的参数称为回调函数 int max(int a, int b) { if (a > b) return a; else return b; } int add(int a, int b) { return a + b; } void func(int(*p)(int, int), int a, int b) { int res = p(a, b); printf("%d\n", res); } int main() { int i = 0; scanf("%d", &i); if (i == 0) func(max, 10, 20); else func(add, 10, 20); return 0; } |
[b]5.1.22 指针运算[/b]赋值:int *p = &a; 求值:int I = *p; 取指针地址 int **pp = &p; 将一个整数加(减)给指针:p + 3; p – 3; 增加(减少)指针值 p++,p-- 求差值 ,p1 – p2,通常用于同一个数组内求两个元素之间的距离 比较 p1 == p2,通常用来比较两个指针是否指向同一个位置。 [b]5.1.23 指针小结[/b]定义 | | | | | | | | | 定义一个指针数组,其中每个数组元素指向一个int型变量的地址 | | | | | | 定义一个指向函数的指针,函数的原型为无参数,返回值为int | | |
[b]6 字符指针与字符串[/b]重点:**** [b]6.1 指针和字符串[/b]在C语言当中,大多数字符串操作其实就是指针操作。 char s[] = "hello word"; char *p = s; p[0] = 'a'; | [b]6.2 通过指针访问字符串数组[/b] [b]6.3 函数的参数为char *[/b]file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE5F.tmp.jpg [b]6.4 指针数组做为main函数的形参[/b]int main(int argc, char *argv[]); 作业 //不可以使用任何C语言库函数,只可以自己写函数实现int 到字符串的转化 void itoa(int i, char *s) { } file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE60.tmp.jpg [b]7 内存管理[/b]重点:***** [b]7.1 作用域[/b]一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域。 代码块是{}之间的一段代码。 [b]7.1.1 auto自动变量[/b]一般情况下代码块内部定义的变量都是自动变量。当然也可以显示的使用aotu关键字 [b]7.1.2 register寄存器变量[/b]通常变量在内存当中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高 register int I; [b]7.1.3 代码块作用域的静态变量[/b]静态变量是指内存位置在程序执行期间一直不改变的变量,一个代码块内部的静态变量只能被这个代码块内部访问。 [b]7.1.4 代码块作用域外的静态变量[/b]代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件访问 [b]7.1.5 全局变量[/b]全局变量的存储方式和静态变量相同,但可以被多个文件访问 [b]7.1.6 外部变量与extern关键字[/b]extern int I; [b]7.1.7 全局函数和静态函数[/b]在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态 [b]7.2 内存四区[/b]file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE61.tmp.jpg [b]7.2.1 代码区 [/b]代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段,这块内存是不可以在运行期间修改的。 [b]7.2.2 静态区[/b]所有的全局变量以及程序中的静态变量都存储到静态区,比较如下两段代码的区别 int a = 0; int main() { static int b = 0; printf("%p, %p\n", &a, &b); return 0; } | int a = 0; static int b = 0; int main() { printf("%p, %p\n", &a, &b); return 0; } |
[b]7.2.3 栈区[/b]栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE72.tmp.jpg [b]7.2.4 堆区[/b]堆heap和栈一样,也是一种在程序运行过程中可以随时修改的内存区域,但没有栈那样先进后出的顺序。 堆是一个大容器,它的容量要远远大于栈,但是在C语言中,堆内存空间的申请和释放需要手动通过代码来完成。 [b]7.3 堆的分配和释放[/b][b]7.3.1 malloc[/b]file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE73.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE74.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE75.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE76.tmp.jpg [b]7.3.2 free[/b] [b]7.3.3 calloc:[/b]第一个参数是所需内存单元数量,第二个参数是每个内存单元的大小(单位:字节),calloc自动将分配的内存置0 int *p = (int *)calloc(100, sizeof(int));//分配100个int |
[b]7.3.4 realloc[/b]重新 分配大小。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE77.tmp.jpg 在C语言当中,内存初始化是个好习惯, 除了全局变量和静态变量以外,其他变量C语言编译不会帮你初始化,只有自己通过显示的初始化。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE87.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAE88.tmp.jpg |