C语言学习笔记<八>
通过使用联合可以用不同的方式操作内存中同一段区域。
计算机中存储数据的方式有两种,把低位数据存储在低地址字节中的方式叫做小端存储方式,相反就叫大端存储方式,我们的计算机采用的是小端存储方式。
使用枚举类型可以把一组名称转换成整数,从数字0开始。
堆里的变量的生命周期是由程序员来管理的,
可以使唤用C语言提供的函数对堆中的变量进行管理,为了使用这些函数需要包含头文件stdlib.h。
malloc函数可以从堆中分配指定个数的连续字节把首字节地址返回。如果失败则返回NULL .
free 函数可以把堆中的变量释放掉,需要首字节地址作为参数。
calloc 函数也可以从堆中分配变量,并且保证把变量都清0.
realoc 函数可以调整一段已经分配好的内存空间的大小。如果失败返回空地址。特殊情况下操作效果类似于malloc 或free.0
const 指针有两种声明方法
const int *p_value;
int * const p_value;
前一种指针表示的整数变量不可以被修改
后一种指针表示的指针变量本身不可以被修改。
二级指针变量用来记录一级指针变理的地址,声明方法如下
int **pp_value;
二级指针变理可以用来表示它自己和对应的一级指示变量以及整数变量,使用方法如下
pp_value 表示二级指针
*pp_value 表示对应的一级指针。
**pp_value 表示对应的整数变量。
二级指针做函数的输出参数,可以让函数把内部的地址数据报告给调用函数。
//===================================================================
函数名称可以当成地址数据使用,函数指针变量可以用来记录函数的地址并可以用来调用函数。
函数指针的声明是从函数声明变化得到的。
qsort 函数可以完成一个数组中所有数组的按顺序排列问题。需要包含stdlil.h 文件。使用一个用户编写的函数来觉得某两个数组的前后顺序。
由多个指针变量构成的数组叫指针数组,声明如下
char * strs[5]
指针数组和二级指针可以互相通用:
/*============================================== *名称: 功能:无 *日期:2013-05-16 by:ant *备注: *============================================== */ #include<stdio.h> int main() { int value = 3; const int *p_value = &value; int * const p_value1 = &value; //*p_value = 3;错误,const指针无法修改变量的值。 value = 7; *p_value1 = 5; // p_value1 = NULL; 指针的内容不能被修改。 p_value = NULL; return 0; }
/*=========================================== *名称:二级指针练习 功能:无 *日期:2013-05-1666666 by:ant *备注: *========================================== */ #include<stdio.h> #include<stdlib.h> void func1(int **pp_value) { *pp_value = (int *)0x12345678; } void func(int *p_value) { *p_value = 3; } int main() { int value = 0; int *p_value = NULL; func(&value); printf("value是%d\n",value); func1(&p_value); return 0; }
/*======================================== *名称: 功能:无 *日期:2013-05-16 by:ant *备注:分割字符串 *========================================== */ #include<stdio.h> #include<stdlib.h> int main() { int i = 0; char str[] = "abc,def,xyz"; for(i=0;i<sizeof(str)/sizeof(char)-1;i++) { if(str[i] == ',' || str[i] =='\0')//设定分割符 { //printf("i的值是:%dstr[i]的值是%c\n",i,str[i]); // break; printf("\n"); continue; } printf("%c",str[i]); } return 0; }
/*========================================== *名称:函数指针练习 功能:无 *日期:2013-05-16 by:ant *备注: *======================================== */ #include<stdio.h> #include<stdlib.h> int add(int value,int value1) { return value + value1; } int sub(int value,int value2) { return value - value2; } int main() { int (*p_func)(int,int) = NULL; typedef int (*t_faunc)(int,int);//可以把函数指针变成一种类型来用 t_faunc p_func1 = NULL; printf("add是%p\n",add); p_func = add; printf("结果是%d\n",p_func(1,2)); p_func = sub; printf("sub结果是%d\n",p_func(5,3)); p_func1= sub; printf("另一种方法sub的结果是%d\n",p_func1(10,8)); return 0; }
/*============================================ *名称:函数指针练习 功能:无 *日期:2013-05-16 by:ant *备注: *========================================== */ #include<stdio.h> #include<stdlib.h> int add(int a,int b) { return a + b; } int sub(int a,int b) { return a - b; } int main() { int (*p_func)(int,int) = NULL; int opr = 0; printf("请输入一个整数:"); scanf("%d",&opr); if(opr) { p_func = sub; } else { p_func = add; } printf("计算结果是%d\n",p_func(2,3)); return 0; }
/*=========================================== *名称: 功能:无 *日期:2013-05-15 by:ant *备注: *=========================================== */ #include<stdio.h> #include<stdlib.h> int main() { int i = 0; int *p_value1 = (int *)malloc(4 * sizeof(int)); //int *p_value2 = (int *)malloc(1 * sizeof(int)); //int *p_value3 = (int *)malloc(1 * sizeof(int)); //int *p_value4 = (int *)malloc(1 * sizeof(int)); if (p_value1) { for (i = 0; i<=3; i++) { printf("请输入一个整数:"); scanf("%d",p_value1 + i); } for(i =3; i>=0;i--) { printf("%d",*(p_value1+i)); } // scanf("%d%d%d%d",p_value1,p_value1+1,p_value1+2,p_value1+3); // printf("%d\n%d\n%d\n%d\n",*p_value1,*(p_value1+1),*(p_value1+2),*(p_value1+3)); free(p_value1); // p_value1 = p_value2 = p_value3 = p_value4 = NULL; p_value1 = NULL; printf("\n"); } return 0; }
/*============================================== *名称: malloc练习 功能:无 *日期:2013-05-15 by:ant *备注: *============================================= */ #include<stdio.h> #include<stdlib.h> int main() { //int value = 0; int *p_value = (int *)malloc(1 * sizeof(int));//从堆中分配一个整数型大小的地址。由于分配的地址无变量名,所以我们要用指针来管理这个变量 if(p_value)//由于分配并不一定成功,所以要检查一下,避免出现野指针。 { printf("value是%d\n",*p_value); free(p_value);//释放内存 p_value = NULL;//不能用的指针要及时的设为空指针 } return 0; }
/*========================================= *名称:堆练习 功能:无 *日期:2013-05-16 by:ant *备注: *======================================= */ #include<stdio.h> #include<stdlib.h> int main() { int *p_value = (int *)calloc(4,sizeof(int)); int *p_value1 = NULL; if (p_value) { p_value1 = realloc(p_value,6 * sizeof(int));//通过realloc函数可以改变原申请的内存空间大小,参数1是原空间的首地址,参数2是调整后的大小。 if(p_value1) { p_value = p_value1; } free(p_value); p_value = NULL; } return 0; }