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]);
}
二、数组指针
数组指针本质还是个指针
是一个指向数组的指针
也可称为一个数组的地址(数组第一个元素的地址)
数组指针的定义
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;
}
函数指针和数组指针一样格式要求很强
需注意指针类型与函数类型一致,输入要求也需一致
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++);
}