如何定义一个指向数组的指针
展开全部
指针数组是一种特殊的数组,指针数组的数组元素都是指针变量。指针数组的定义格式为:
类型名称
*数组名称[数组长度];
例如:float
*pf[3];
因为下标运算符[]的优先级高于指针运算符*,上述定义等价于:float
*
(pf[3]);
说明pf是一个含有3个元素的数组,数组元素为指向float型变量的指针变量。
又如:
int
*pn[5];
/*定义一个5个元素的指针数组,数组元素为指向int型变量的指针变量*/
char
*pc[10];
/*定义一个10个元素的指针数组,元素为指向char型变量的指针变量*/
不论指针数组是什么类型,指针数组的每个数组元素都用来保存一个地址值,在TurboC下,每个数组元素是一个unsigned
int型变量,占用2个字节。
指针数组定义后,可以使数组元素指向一个变量和其他数组的首地址。下面是一个指针数组定义和引用的例子。
main()
{
int
i;
char
c1[]="How";
char
c2[]="are";
char
*c3="you";
char
*pArray[3];
pArray[0]=c1;
pArray[1]=c2;
pArray[2]=c3;
for(i=0;i<3;i++)
printf("%s
",
pArray[i]);
}
程序运行的结果为:
How
are
you
说明:
(1)程序中c1,c2被定义为字符数组并初始化;c3是一个指针变量,指向字符串所在字符数组的首地址。
(2)语句char
*pArray[3];定义了三个元素的指针数组pArray,数组元素是指向char型变量或数组的指针变量。
(3)语句pArray[0]=c1;将字符数组c1的首地址赋给pArray[0],指针变量pArray[0]指向了c1的首地址。
(4)for循环中,语句printf("%s
",
pArray[i]);依次打印了三个字符数组的内容。比如,pArray[0]里存放了c1的首地址,printf("%s
",
pArray[0])和printf("%s
",
c1)的作用是相同的。
字符数组c1,c2,c3和指针数组pArray的内存情况如下图(图中的数组首地址值是假设的值)。
指针数组pArray占用了从FFC0开始的6个字节。char型变量占用1个字节,因此字符数组c1,c2,c3均占用4个字节(包括字符串结束符'\0')。pArray[0]里存放了字符数组c1的首地址FF10,使pArray[0]指向c1。pArray[1]里存放了字符数组c2的首地址FF50,使pArray[1]指向c2。pArray[2]里存放了字符数组c3的首地址FF70,使pArray[2]指向c3。
类型名称
*数组名称[数组长度];
例如:float
*pf[3];
因为下标运算符[]的优先级高于指针运算符*,上述定义等价于:float
*
(pf[3]);
说明pf是一个含有3个元素的数组,数组元素为指向float型变量的指针变量。
又如:
int
*pn[5];
/*定义一个5个元素的指针数组,数组元素为指向int型变量的指针变量*/
char
*pc[10];
/*定义一个10个元素的指针数组,元素为指向char型变量的指针变量*/
不论指针数组是什么类型,指针数组的每个数组元素都用来保存一个地址值,在TurboC下,每个数组元素是一个unsigned
int型变量,占用2个字节。
指针数组定义后,可以使数组元素指向一个变量和其他数组的首地址。下面是一个指针数组定义和引用的例子。
main()
{
int
i;
char
c1[]="How";
char
c2[]="are";
char
*c3="you";
char
*pArray[3];
pArray[0]=c1;
pArray[1]=c2;
pArray[2]=c3;
for(i=0;i<3;i++)
printf("%s
",
pArray[i]);
}
程序运行的结果为:
How
are
you
说明:
(1)程序中c1,c2被定义为字符数组并初始化;c3是一个指针变量,指向字符串所在字符数组的首地址。
(2)语句char
*pArray[3];定义了三个元素的指针数组pArray,数组元素是指向char型变量或数组的指针变量。
(3)语句pArray[0]=c1;将字符数组c1的首地址赋给pArray[0],指针变量pArray[0]指向了c1的首地址。
(4)for循环中,语句printf("%s
",
pArray[i]);依次打印了三个字符数组的内容。比如,pArray[0]里存放了c1的首地址,printf("%s
",
pArray[0])和printf("%s
",
c1)的作用是相同的。
字符数组c1,c2,c3和指针数组pArray的内存情况如下图(图中的数组首地址值是假设的值)。
指针数组pArray占用了从FFC0开始的6个字节。char型变量占用1个字节,因此字符数组c1,c2,c3均占用4个字节(包括字符串结束符'\0')。pArray[0]里存放了字符数组c1的首地址FF10,使pArray[0]指向c1。pArray[1]里存放了字符数组c2的首地址FF50,使pArray[1]指向c2。pArray[2]里存放了字符数组c3的首地址FF70,使pArray[2]指向c3。
展开全部
这个用typedef可以完成:
先定义一个函数指针的类型:typedef
void
(*pfun)();
然后用这个类型pfun定义一个数组
pfun
ptr[5];//[]里的数字是数组元素的个数,依情况而定:这儿用5做例子
这样ptr就是一个指向函数指针的数组。
对于“把一个指针强制定义”这我还没听过这个说法,只听过把指针强制转换成某个类型的指针:
强制类型转换用()运算,仍然用上面的定义类型。
例如:
void
*p;//p是一个void指针
pfun
ptr;//ptr是一个指向void函数的指针
ptr=(pfun)p;//把p强制转换成指向void函数的指针,然后就可以把它赋值给ptr指针。
不用typedef也可以,只要合并就可以了:
void
(*ptr[5])();//这样ptr就是一个函数指针数组了.这样看很费解的!不如用typedef。
对于强制类型转换最好还是用typedef,那样可读性好。
而且个人认为指针没有那种基本类型(指向函数的指针类型),那是一种新的类型。所以要先定义那种类型才行。
用typedef定义新类型又没有什么副作用,而且容易读懂,何必非要不用typedef呢?!没必要把简单的问题复杂化!!
程序代码的可读性是很重要的,写复杂的类型而不用typedef是很令人反感的!
先定义一个函数指针的类型:typedef
void
(*pfun)();
然后用这个类型pfun定义一个数组
pfun
ptr[5];//[]里的数字是数组元素的个数,依情况而定:这儿用5做例子
这样ptr就是一个指向函数指针的数组。
对于“把一个指针强制定义”这我还没听过这个说法,只听过把指针强制转换成某个类型的指针:
强制类型转换用()运算,仍然用上面的定义类型。
例如:
void
*p;//p是一个void指针
pfun
ptr;//ptr是一个指向void函数的指针
ptr=(pfun)p;//把p强制转换成指向void函数的指针,然后就可以把它赋值给ptr指针。
不用typedef也可以,只要合并就可以了:
void
(*ptr[5])();//这样ptr就是一个函数指针数组了.这样看很费解的!不如用typedef。
对于强制类型转换最好还是用typedef,那样可读性好。
而且个人认为指针没有那种基本类型(指向函数的指针类型),那是一种新的类型。所以要先定义那种类型才行。
用typedef定义新类型又没有什么副作用,而且容易读懂,何必非要不用typedef呢?!没必要把简单的问题复杂化!!
程序代码的可读性是很重要的,写复杂的类型而不用typedef是很令人反感的!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有2种模式:一种是自身的数组变量就是一个指针(这样说不太准确)
另一种就是传说的定义模式:
int
*a=NULL;
int
arr[20];
a=arr;
本身arr就是一个指针,如果你学了汇编对这些指针类问题解决起来就太简单的!
另一种就是传说的定义模式:
int
*a=NULL;
int
arr[20];
a=arr;
本身arr就是一个指针,如果你学了汇编对这些指针类问题解决起来就太简单的!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |