C语言相关知识——指针常用函数

1.malloc

头文件: #include <stdlib.h>
函数功能: C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。
函数原型:
函数名: malloc
形式参数: size_t size :内存块的大小,以字节为单位。本质上就是一个 unsigned int
返回值类型: void* :该函数返回一个指针,指向已分配大小的内存,如果请求失败,返回NULL。

举例:

int *p = (int*)malloc(4);

说明:

1. malloc 函数分配的内存没有默认值,是不确定数,大概率是 0
2. malloc 函数申请的内存空间连续。

callo

头文件: #include <stdlib.h>
函数功能: C 库函数 void * calloc(size_t nitems,size_t size) 分配所需的内存空间,并返回一
个指向它的指针。
malloc calloc 之间不同点事, malloc 不会设置内存为零,而 calloc 会设置内存为零。
函数原型: void *calloc(size_t nitems,size_t size)
函数名: calloc
形式参数:
size_t nitems :申请多少个
size_t size :一个占几个内存单元(一个内存单元 等于 一个字节)
返回值类型: void* :该函数返回一个指针,指向已分配大小的内存。如果请求失败,返回
NULL
举例:
int *p = (int*)calloc(3,4); // p指向的空间的大小是12个字节
if(!p) printf("内存申请失败!\n");
说明:
1. calloc 函数分配的内存有默认值,每个内存单元都是 0
2. calloc 函数申请的内存空间连续
3. calloc 大多时候为数组中的元素申请内存
转存栈中数组中的数据:
int arr[3] = {10,20,30}; // 在栈区
int *p = (int*)calloc(3,4); // 申请内存,在堆区
if(!p) puts("内存申请失败!");
// 转存
for(int i = 0;i < 3; i++)
p[i] = arr[i];
// 遍历
for(int i = 0;i < 3; i++)
printf("%d,",p[i]);
printf("\n");
// p使用完,记得释放内存
free(p);
p = NULL; // 内存回收后,建议置空

realloc

头文件: #include <stdlib.h>
函数功能:尝试重新调整之前调用 malloc calloc 所分配的 ptr 所指向的内存块的大小。
函数原型: void *realloc(void *ptr,size_t size)
函数名: realloc
形式参数:
void *ptr :是 malloc 或者 calloc 的返回值
size_t size :重新分配后的内存大小
返回值: void* :该函数返回一个指针,指向已分配大小的内存。如果请求失败,返回 NULL
案例:
int *p = (int*)malloc(4);
int *w = (int*)realloc(p,20);
// int *q = (int*)realloc(p,0); // 等效于free(p)
说明:
1. realloc 以原来 malloc 返回的内存地址开始,分配总共 20 个字节的内存空间
2. 如果原来的内存空间后有 20 个连续空间,就扩容 20-4 =16 个内存单元,返回原来旧的内存首地
址。
3. 如果原来的内存空间后不够 20 个连续内存空间,就重新找一个内存地址开始,申请 20 个内存
单元。并将原来的数据拷贝到新的内存中,回收旧的内存单元,并返回新的内存首地址。

free

头文件: #include <stdlib.h>
函数功能:释放之前调用 malloc calloc realloc 所分配的内存空间,是访问完记得使用 NULL
空。
函数原型: void free(void *ptr)
函数名: free
形式参数:
void *ptr calloc,malloc.realloc 的返回值
返回值类型: void :没有返回值
注意:
1. 堆内存中的指针才需要回收,栈中系统会自动回收
2. 堆内存不能重复回收,运行会报错
说明:
1. 堆的内存空间相比较栈要大很多
2. 内存分配函数返回的指针变量可以参与运算(只读),但不能被修改( p++ 或者 p+=i 是错误的)

void与void*的区别

定义:
void :是空类型,是数据类型的一种
void* :是指针类型,是指针类型的一种,可以匹配任意类型的指针,类似于通配符
void
说明: void 作为返回值类型使用,表示没有返回值;作为形参,表示形参列表为空,在调用函
数是不能给实参
举例:
// 函数声明
void fun(void); // 等效于 void fun();
// 函数调用
fun();
void*
说明:
void* 是一个指针类型,但该指针的数据类型不明确,无法通过解引用获取 内存中的数据,
因为 void* 不知道访问几个内存单元。
void* 是一种数据类型,可以作为函数返回值类型,也可以作为形参类型
void* 类型的变量在使用之前必须强制类型转换,明确它能够访问几个字节的内存空间
int *p = (int*)malloc(4);
double *p2 = (double*)malloc(8);

举例:

#include <stdio.h>
#include <stdlib.h>
// 函数定义
void* fun(void* p) // 指针函数(返回值类型是指针的函数,此时返回的是不明确类型,需要外部强转)
{
int *p;
// double *p;
// long *p;
// char *p;
return p;
}
// 函数调用
void main()
{
int *p;
void* a = fun(p);// 这种接收方式,实际上没有意义
printf("%p\n",a);// 可以正常打印,打印出一个地址
*a = 10;// 编译报错,void*变量不能解引用访问数据
int *w = (int*)a;
*w = 10;// 编译和运行正常,void*变量a在使用前已经强制类型转换了,数据类型明确了,访问的内存
单元明确了。
}
说明:
void* 作为返回值类型:这个函数可以返回任意类型( char*,int*,double* )的指针。
void* 作为形参类型:这个函数在调用时,可以给任意类型( char*,int*,double* )的指
针。
总结:
void* 类似于通配符,不能对 void* 类型的变量解引用(因为不明确内存单元的大小)。
void* 在间接访问(解引用)前要强制类型转换,但不能太随意,否则存和去的数据类型不
一致。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值