欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-07 11:34:04
...

一、指针数组

好多地址的集合

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

指针数组的定义

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

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

二、数组指针

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

数组指针的定义

	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;

C语言基础-指针(三)指针数组、数组指针、函数指针、无类型指针与malloc
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);

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

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

使用场景:二维数组

三、函数指针

存放函数的地址

作用:调用函数

函数指针的定义:

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

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

调用函数的方法:

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

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

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

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

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

C语言基础-指针(三)指针数组、数组指针、函数指针、无类型指针与malloc
使用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++);
    }

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

malloc的特殊说明:

内存泄漏

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

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

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

相关标签: 指针 c语言