malloc函数用于从堆中分配连续多个字节,如果失败则返回NULL。为了使用这个函数需要包含头文件stdlib.h。 free函数可以释放堆中分配的连续多个字节,需要首字节地址作为参数。 calloc函数也可以从堆中分配连续多个字节,失败也返回NULL。这个函数保证把分配到的变量清0。 realloc函数可以调整堆中变量的个数。 可以使用关键字const声明指针变量, const int *p_value 这样声明的指针变量不能用来修改对应的整数变量内容 int * const p_value 这样声明的指针变量只能在初始化的时候被赋值一次,以后就不可以再被赋值了。 二级指针用来记录一级指针的地址,声明方法如下 int **pp_value = NULL; 其中**表示二级指针类型 *pp_value表示一级指针变量,**pp_value表示普通变量 函数名称可以代表函数的地址 函数指针变量可以记录函数地址,声明方法如下 int (*p_add)(int, int); 函数指针变量可以用来调用函数 qsort函数可以实现对数组中所有数据从小到大排序的功能,需要一个函数地址用来比较数组中两个数字之间的大小关系。 /* malloc练习 */ #include <stdio.h> #include <stdlib.h> int main() { //int value = 0; int *p_value = (int *)malloc(sizeof(int)); if (p_value) { *p_value = 3; printf("数字是%d\n", *p_value); free(p_value); p_value = NULL; } return 0; } /* malloc练习 */ #include <stdio.h> #include <stdlib.h> int main() { int loop = 0; int *p_value = malloc(4 * sizeof(int)); if (p_value) { for (loop = 1; loop <= 4; loop++) { // *(p_value+4 - loop) = loop; p_value[4-loop] = loop; } for (loop = 0; loop <= 3; loop++) { printf("%d ", *(p_value + loop)); } printf("\n"); free(p_value); p_value = NULL; } return 0; } /* malloc练习 */ #include <stdio.h> #include <stdlib.h> int *read() { /*int value = 0; return &value;*/ return (int *)malloc(sizeof(int)); } int main() { int *p_value = read(); if (p_value) { *p_value = 3; printf("数字是%d\n", *p_value); free(p_value); p_value = NULL; } return 0; } /* calloc练习 */ #include <stdio.h> #include <stdlib.h> int main() { int *p_value = calloc(1, sizeof(int)); if (p_value) { printf("数字是%d\n", *p_value); free(p_value); p_value = NULL; } return 0; } /* realloc练习 */ #include <stdio.h> #include <stdlib.h> int main() { int loop = 0; int *p_value = malloc(4 * sizeof(int)); if (p_value) { for (loop = 5; loop <= 8; loop++) { *(p_value + loop - 5) = loop; } int *p_value1 = realloc(p_value, 6 * sizeof(int)); if (p_value1) { p_value = p_value1; } p_value1 = NULL; for (loop = 0; loop <= 3; loop++) { printf("%d ", *(p_value + loop)); } printf("\n"); free(p_value); p_value = NULL; } return 0; } /* const指针练习 */ #include <stdio.h> int main() { int value = 4; //int *p_value = NULL; //const int *p_value = NULL; int * const p_value = NULL; p_value = &value; *p_value = 7; return 0; } /* const指针练习 */ #include <stdio.h> int sum(const int *p_value, int num) { int loop = 0, result = 0; for (loop = 0; loop <= (num - 1); loop++) { //*(p_value + loop) = 0; 编译错误 result += *(p_value + loop); } return result; } int main() { int values[] = {4, -2, 9, -4}, loop = 0; int result = sum(values, 4); printf("求和结果是%d\n", result); for (loop = 0; loop <= 3; loop++) { printf("%d ", values[loop]); } printf("\n"); return 0; } /* 函数指针练习 */ #include <stdio.h> int add(int x, int y) { return x + y; } int main() { int (*p_func)(int, int); typedef int (*t_func)(int, int); t_func p_func1 = add; printf("add是%p\n", add); p_func = add; printf("p_func(2, 3)是%d\n", p_func(2, 3)); printf("p_func1(2, 3)是%d\n", p_func1(2, 3)); return 0; } /* 函数指针练习 */ #include <stdio.h> int mul(int x, int y) { return x * y; } int div(int x, int y) { return x / y; } int main() { int (*p_func)(int, int) = NULL; p_func = mul; printf("p_func(10, 2)是%d\n", p_func(10, 2)); p_func = div; printf("p_func(10, 2)是%d\n", p_func(10, 2)); return 0; } /* qsort练习 */ #include <stdio.h> #include <stdlib.h> int compare(const void * p_value, const void * p_value1) { int *p_int1 = (int*)p_value; int *p_int2 = (int*)p_value1; if (*p_int1 > *p_int2) { return 1; } else if (*p_int1 < *p_int2) { return -1; } else { return 0; } } int compare1(const void * p_value, const void * p_value1) { return 0 - compare(p_value, p_value1); } int main() { int values[] = {7, -3, 5, 1, 4}, loop = 0; qsort(values, 5, sizeof(int), compare); for (loop = 0; loop <= 4; loop++) { printf("%d ", values[loop]); } printf("\n"); qsort(values, 5, sizeof(int), compare1); for (loop = 0; loop <= 4; loop++) { printf("%d ", values[loop]); } printf("\n"); return 0; }