C语言基础十



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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值