函数指针数组怎么定义(如何声明并定义函数数组)

本文目录
如何声明并定义函数数组
定义数组必须要确定它的长度,所以int 其实是一个道理,它会在调用时被赋予初值和长度。 申请的空间通过栈来保存,使用完了就会释放,下一次调用,又会被赋予不同的初值和长度。
如何定义一个指向函数的指针数组
这个用typedef可以完成:
先定义一个函数指针的类型:typedef void (*pFUN)();
然后用这个类型pFUN定义一个数组
pFUN ptr里的数字是数组元素的个数,依情况而定:这儿用5做例子
这样ptr就是一个指向函数指针的数组。
对于“把一个指针强制定义”这我还没听过这个说法,只听过把指针强制转换成某个类型的指针:
强制类型转换用()运算,仍然用上面的定义类型。
例如:
void *p;//p是一个void指针
pFUN ptr;//ptr是一个指向void函数的指针
ptr=(pFUN)p;//把p强制转换成指向void函数的指针,然后就可以把它赋值给ptr指针。
不用typedef也可以,只要合并就可以了:
void (*ptr)();//这样ptr就是一个函数指针数组了.这样看很费解的!不如用typedef。
对于强制类型转换最好还是用typedef,那样可读性好。
而且个人认为指针没有那种基本类型(指向函数的指针类型),那是一种新的类型。所以要先定义那种类型才行。
用typedef定义新类型又没有什么副作用,而且容易读懂,何必非要不用typedef呢?!没必要把简单的问题复杂化!!
程序代码的可读性是很重要的,写复杂的类型而不用typedef是很令人反感的!
返回值是一个数组指针的函数怎么定义
int a;
声明int * f();
返回int数组指针
定义
int *f()
{
return a;
}
数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
例:int (*p); p即为指向数组的指针,又称数组指针。
数组指针是指向数组地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 int *p三个指针),其本质为数组。
数组指针的使用在某些情况下与指针数组很相似,要注意区别。
指针数组的创建和用法
创建:
(1)声明一个数组,声明时用常量表达式指定数组维数,然后可以用数组名访问数组元素。
(2)声明一个变长数组,声明时用变量表达式指定数组维数,然后用数组名来访问数组元素。
(3)声明一个指针,调用malloc(),然后使用该指针来访问数组元素。malloc接受一个参数:所需内存字节数。然后malloc()找到可用内存中一个大小合适的块。内存是匿名的;也就是说,malloc()分配了内存,但没有为它指定名字。然而,它却可以返回那块内存第一个字节的地址。因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存。因为char代表一个字节,所以传统上曾将malloc()定义为指向char的指针类型。然而,ANSI
C标准使用了一个新类型:指向void的指针。这一类型被用作“通用指针”。函数malloc()可用来返回数组指针、结构指针等等,因此一般需要把返回值的类型指派为适当的类型。如果malloc()找不到所需的空间,它将返回空指针。我们使用malloc()来创建一个数组,可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。例如,考虑以下代码:
double
*
ptd;
ptd
=
(double
*)malloc(30*sizeof(double));
使用第二种或第三种方法可以做一些用普通的数组声明做不到的事;创建一个动态数组(dynamic
array),即一个在程序运行时才分配内存并可在程序运行时选择大小的数组。例如,假定n是一个整数变量。在C99之前,不能这样做:
double
item;
/*如果n是一个变量,C99之前不允许这样做*/
然而,即使在C99之前的编译器中,也可以这样做:
ptd=(double
*)malloc(n*sizeof(double));
变长数组VLA和malloc的用法有两点区别。一个区别在于VLA是自动存储的。自动存储的结果之一就是VLA所用内存空间在运行完定义部分之后会自动释放。因此不必使用free()。另一方面,使用由malloc()创建的数组不必局限在一个函数中。例如,函数可以创建一个数组并返回指针,供调用该函数的函数访问。接着,后者可以在它结束时调用free()。free()可以使用不同于malloc()指针的指针变量;必须一致的是指针中存储的位置。
用法:
//注意指针数组和数组指针分别是如何指向二维数组的
#include
《stdio.h》
main()
{
static
int
m={0,1,2,3,4,5,6,7,8,9,10,11};
int
(*p);//数组指针
p是指针,指向一维数组,每个一维数组有4个int元素*p是个数组的地址,**p就是数组元素了
int
i,j;
int
*q;//指针数组
q是数组,数组元素是指针,3个int指针
p=m;
//p是指针,可以直接指向二维数组
printf("--数组指针输出元素--\n");
for(i=0;i《3;i++)
{
for(j=0;j《4;j++)
{
printf("]
",*(*(p+i)+j));
}
printf("\n");
}
printf("\n");
for(i=0;i《3;i++,p++)//p可看成是行指针
{
printf("=
",**p);//每一行的第一个元素
printf("=
",*(*p+1));//每一行的第二个元素
printf("=
",*(*p+2));//每一行的第三个元素
printf("=
",*(*p+3));//每一行的第四个元素
printf("\n");
}
printf("\n");
printf("--指针数组输出元素--\n");
for(i=0;i《3;i++)
q是指针
for(i=0;i《3;i++)
{
for(j=0;j《4;j++)
{
printf("=
",q+j)
}
printf("\n");
}
printf("\n");
q;
for(i=0;i《3;i++)
{
for(j=0;j《4;j++)
{
printf("=
",*(q+j+4*i));
}
printf("\n");
}
printf("\n");
}
如何定义一个指向数组的指针
指针数组是一种特殊的数组,指针数组的数组元素都是指针变量。指针数组的定义格式为:
类型名称
*数组名称;
例如:float
*pf;
因为下标运算符的优先级高于指针运算符*,上述定义等价于:float
*
(pf);
说明pf是一个含有3个元素的数组,数组元素为指向float型变量的指针变量。
又如:
int
*pn;
/*定义一个5个元素的指针数组,数组元素为指向int型变量的指针变量*/
char
*pc;
/*定义一个10个元素的指针数组,元素为指向char型变量的指针变量*/
不论指针数组是什么类型,指针数组的每个数组元素都用来保存一个地址值,在TurboC下,每个数组元素是一个unsigned
int型变量,占用2个字节。
指针数组定义后,可以使数组元素指向一个变量和其他数组的首地址。下面是一个指针数组定义和引用的例子。
main()
{
int
i;
char
c1="How";
char
c2="are";
char
*c3="you";
char
*pArray;
pArray=c1;
pArray=c2;
pArray=c3;
for(i=0;i《3;i++)
printf("%s
",
pArray);
}
程序运行的结果为:
How
are
you
说明:
(1)程序中c1,c2被定义为字符数组并初始化;c3是一个指针变量,指向字符串所在字符数组的首地址。
(2)语句char
*pArray;定义了三个元素的指针数组pArray,数组元素是指向char型变量或数组的指针变量。
(3)语句pArray指向了c1的首地址。
(4)for循环中,语句printf("%s
",
pArray里存放了c1的首地址,printf("%s
",
pArray)和printf("%s
",
c1)的作用是相同的。
字符数组c1,c2,c3和指针数组pArray的内存情况如下图(图中的数组首地址值是假设的值)。
指针数组pArray占用了从FFC0开始的6个字节。char型变量占用1个字节,因此字符数组c1,c2,c3均占用4个字节(包括字符串结束符’\0’)。pArray指向c3。
数组指针,字符串指针的几种定义方法
一:数组指针的定义方法
1.
int a = {1,2,3,4,5,6,7,8,9,0};
int * p;
p = &a; // 等价于p = a;
1
2
3
2.
int a = {1,2,3,4,5,6,7,8,9,0};
int * p = a; //定义指针时直接赋值;
1
2
3
二:输入字符串的方法
1.直接把字符串输入到字符数组
char str = "I love China!";
printf ("%s \n",str);
puts (str);
1
2
3
2.定义一个指向字符型指针
char * str = "I love China!";
puts (str)
/*
等价于:
char * str;
str = "I love China!";
*/
3 . 通过gets函数
char str;
gets (str);
puts (str);
4.指针指向数组首元素地址,然后将字符串首地址赋给指针
char *a, str;
a = str;
scanf("%s",a);
不能用以下错误方法定义
错误1.
char str;
str = "I love China!"; //数组名是地址,是常量,不能被赋值;
错误2.
char str;
str = "I love China!"; //错误!企图把字符串赋给数组中各个元素。

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40






