指针数组本质还是个数组
是一个存指针的数组
在第一篇文章里我们讲了指针=地址,所以指针数组也可以称为地址数组,存放的都是地址。
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后地址与原地址的差值)为指向数组的大小
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);
函数指针的定义:
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函数
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++);
}