C语言基础-指针(三)指针数组、数组指针、函数指针、无类型指针与malloc

一、指针数组

好多地址的集合

指针数组本质还是个数组
是一个存指针的数组
在第一篇文章里我们讲了指针=地址,所以指针数组也可以称为地址数组,存放的都是地址。

指针数组的定义

	int a = 1; 
	int b = 2; 
	int c = 3;
    int *abc[3];
    abc[0] = &a; 
    abc[1] = &b; 
    abc[2] = &c;

指针数组abc[]中存放了a、b、c的地址

验证

	int i = 0;
	int a = 1; 
	int b = 2; 
	int c = 3;
    int *abc[3];
    abc[0] = &a; 
    abc[1] = &b; 
    abc[2] = &c;
    for(i=0;i<=2;i++)
    {
    
    
		printf("第%d个指针的内的值为%d\n",i,*abc[i]);
    }

在这里插入图片描述

二、数组指针

数组指针本质还是个指针
是一个指向数组的指针
也可称为一个数组的地址(数组第一个元素的地址)

数组指针的定义

	int a[3] = {
    
    1,2,3};
	int (*p)[3];//C语言写法
    p = a;

数组指针的格式要求很强
数组指针的大小必须与指向的数组大小一致
若不一致,如下:

	int a[3] = {
    
    1,2,3};
	int b;
	int (*p)[3];//C语言写法
    p = b;

在这里插入图片描述
liunx、gcc编译环境下,会出现warning

我们在文章1中讲过,当指针与数组的类型相同时,若指针指向的是数组的首地址,则可以通过指针遍历整个数组,对于这种情况,不能称该指针为数组指针。

== 数组指针与普通指针(上述的指针)最大的区别==

---------------------------------偏移值------------------------------------

数组指针的偏移值(+1后地址与原地址的差值)为指向数组的大小

	int a[3] = {
    
    1,2,3};
	int (*p)[3]; 
    int* b = &a[0];
    p = a;
    printf("指针p指向的初始地址%p指针b指向的初始地址%p\n",p++,b++);
    printf("指针p指向的初始地址%p指针b指向的初始地址%p\n",p,b);

在这里插入图片描述

p自增1,地址+12字节,b自增1,地址+4字节。

使用场景:二维数组

三、函数指针

存放函数的地址

作用:调用函数

函数指针的定义:

void printfll()
{
    
    
	printf("abllalala\n");
}
int main()
{
    
    
	void (*swap)();
    swap = printfll;  
     (*printfll)();	
}

在这里插入图片描述

调用函数的方法:

方法一:通过调用函数名来调用函数

void printfll()
{
    
    
	printf("abllalala\n");
}
int main()
{
    
    
	printfll();
	system("pause");
	return 0;
}

方法二:通过指针来调用函数

void printfll()
{
    
    
	printf("abllalala\n");
}
int main()
{
    
    
	void (*a)();
    a = printfll;  
    (*a)();	
	system("pause");
	return 0;
}

函数指针和数组指针一样格式要求很强

需注意指针类型与函数类型一致,输入要求也需一致

扫描二维码关注公众号,回复: 12137740 查看本文章
void printfll()
{
    
    
	printf("abllalala\n");
}
int swap(int a,int b)
{
    
    
	printf("swap\n");
}
int main()
{
    
    
	int (*a)(int a, int b);
    a = printfll;  
    (*a)();
    a(); 
	system("pause");
	return 0;
}

在这里插入图片描述
使用int型返回值两个输入指针调用无返回值无输入函数出现错误

四、无类型指针与malloc

void:无类型,void main()不是没有返回值,返回值是void类型(无类型)

运用场景:malloc函数
malloc:malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。

int n = 3;
int* a = (int* )malloc(n * sizeof(int));//第一句
int a[n];//第二句

第一句和第二句可以实现相同功能,但第二句并不推荐,当无法确定数组需要的内存空间时可用malloc分配

	int i = 0;
	int n = 3;
    int* a = (int* )malloc(n * sizeof(int));
    for(i=1;i<=3;i++){
    
    
		scanf("%d",a);
        printf("第%d次为%d\n",i,*a++);
    }

在这里插入图片描述

malloc的特殊说明:

内存泄漏

内存泄漏的原因:malloc不断分配内存,操作系统不回收,无free();导致计算机内存损耗殆尽。

解决方法:一个malloc();配一个free();分配内存空间使用过后及时回收

free():的作用就是释放malloc()产生的内存

猜你喜欢

转载自blog.csdn.net/weixin_44933419/article/details/112296181