指针数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 3;
int b = 45;
int c = -9;
int* parry[3];
parry[0] = &a;
parry[1] = &b;
parry[2] = &c;
int i;
for(i=0;i<3;i++)
{
printf(" %d ",*(parry[i]));
}
putchar('\n');
system("pause");
return 0;
}
指针数组按照我们白话文说的就是,指针的数组,说白了它总的就是一个数组,承载了多个指针变量的数组。定义方式:int* parry[3]
数组指针
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3]={8,23,3};
int* p2;
int (*p)[3];
p=a;
p2=a;
printf("地址一:%p\n",a);
printf("地址二:%p\n",&a[0]);
printf("地址三:%p\n",p);
printf("地址四:%p\n",p2);
printf("数组指针的偏移:%p\n",++p);
printf("普通指针的偏移:%p\n",++p2);
system("pause");
return 0;
}
结果:
数组的指针,顾名思义就是承载着数组量的一个指针,为什么这么说呢,我们都知道指针的偏移是有规律的,什么数据类型的指针就偏移相应的字节量,正因为如此,在普通指针中如*p2它的偏移量就应该是(0060FEE0-0060FEDC)4,也就是一个整形变量,而在数组指针中却是(0060FEE8-0060FEDC)12,也就是sizeof(3x(int))个字节,所以看得出,数组指针偏移量就是数组的个数
函数指针
无参数的函数指针
#include <stdio.h>
#include <stdlib.h>
void printWelcom()
{
printf("祖国加油\n");
}
int main()
{
printWelcom();
void (*p)();
p=printWelcom;
p();
(*p)();
printf("%p\n",p);
含参数的函数指针
#include <stdio.h>
#include <stdlib.h>
int add(int a,int b)
{
return a+b;
}
int main()
{
int a=3;
int b=3;
int ret;
int ret2;
int ret3;
ret=add(a,b);
int (*padd)(int a,int b);
padd=add;
ret2=padd(a,b);
ret3=(*padd)(a,b);
printf("指针函数:%d\n",ret);
printf("指针函数:%d\n",ret2);
printf("指针函数:%d\n",ret3);
printf("%p\n",padd);
printf("%p\n",&add);
system("pause");
return 0;
}
可见,定义一个函数指针的方式类似于定义一个函数,该指针指向哪个函数,就按照这个函数的类型去定义,这样一来指针就指向了该函数,也就成了函数指针,对于函数指针可以直接用padd(a,b)这样的方式调用,也可以(*padd)(a,b)来调用
无类型指针
malloc函数(动态分配内存)
malloc函数是用来在C语言中动态分配内存的,一般来说malloc的格式是这样的:void malloc(),()内填入想要开辟的空间大小,而在实际运用当中一般都是把无类型换成整形,实型或者字符型等等。
无类型指针
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i;
printf("请输入你想要开辟的数组空间大小:");
scanf("%d",&n);
int *parry=(int*)malloc(n*sizeof(int));//利用指针,malloc函数定义数组的方法
for(i=0;i<n;i++)
{
printf("请输入第%d个数:\n",i+1);
scanf("%d",&parry[i]);
}
for(i=0;i<n;i++)
{
printf("第%d个数:%d\n",i+1,(*parry)++);
}
system("pause");
return 0;
}
无类型的指针定义之后,用malloc开辟的空间可以用来当做一个数组来使用,换句话说数组的定义除了传统的直接定义,还可以用分配空间给指针的方式来定义一个数组