C语言中关于返回一个指向数组的指针的问题,有谁知道吗

LM165678 2017-12-10 02:50:20
void testA()
{
char* (* ph)();
char * p;
int iIndex;
ph = (char * (*)())(testA_A);
p = (*ph)();
for(iIndex = 0;iIndex < 5;iIndex++)
{
printf("第%d个,为%c\n", iIndex, *(p + iIndex));
}
}
void testB()
{
char (* (*p)())[5];
char (*c)[5];
int iIndex;
p = (char (* (*)())[5])(testA_A);
c = (* p)();
for(iIndex = 0;iIndex < 5;iIndex++)
{
printf("第%d个,为%c\n", iIndex, *((*c) + iIndex));
}
}
char * testA_A()
{
int iIndex;
static char chArray[5] = {'a', 'b', 'c', 'd', 'e'};//写在这里虽然会造成重复赋值
printf("调用一次----------------\n");
for(iIndex = 0;iIndex < 5;iIndex++)
{
printf("第%d个,为%c\n", iIndex, *(chArray + iIndex));
}
printf("-----------end------------\n");
return chArray;
}

这里,testA和testB是两个测试函数,分别用来测试testA_A函数,我明白(*c)[iIndex]和*(p + iIndex)是取对应值,可是testA声明的是放回"一个char *指向"的函数指针,而testB声明的是返回"一个指向一个长度为5的char数组的指针"的函数指针,
可是都是调用char * testA_A()函数啊,可以看到在testA中用一个char *指针来接收返回值,这个很正常,但是在
testB中用一个指向数组的char指针来接收,虽然某种程度上都是char *指针,我的理解是,char (*c)[5]跟char * p;在某种程度上一致,只不过char (*c)[5]是强列表明c指向一个数组的某个字符的指针,并且这个数组长度是为5;
但是在testB中取值时,首先要(*c)获取一个地址,然后再*((*c) + iIndex)再取第iIndex个的值,有哪位大神知道吗,分数目前有50分
...全文
1565 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlbertS 2018-04-02
  • 打赏
  • 举报
回复
在我看来在testA中testA_A返回的是char*,那么指针加1会向后移动一个字节 testB中testA_A返回的是char (*)[5],那么指针加1会向后移动5个字节,所以需要先解引用,然后在加1
LM165678 2018-04-02
  • 打赏
  • 举报
回复
引用 8 楼 LM165678 的回复:
[quote=引用 2 楼 sky065530 的回复:] 数组的名字除了在做sizeof的参数之外,其他时候都是指向数组下表为0的元素,例子,a【10】,×a就是a【0】 char (*c)[5];等价于 char c[ ][5];,所以c等价于c[0],*c等价于c[0][0],取第iIndex个的值就是c[0][iIndex]也就是×(c[0][0] + index)也就是*((*c) + iIndex)
你好,你说"char (*c)[5];等价于 char c[ ][5];",但是在char * testA_A()函数中,是static char chArray[5],而不是static char chArray[?][5]数组...[/quote] 还有,char (*c)[5],等价于char (x)[5];x是任意数组名称,比如char (names)[5];可以去掉括号,即char names[5];
LM165678 2018-04-02
  • 打赏
  • 举报
回复
引用 2 楼 sky065530 的回复:
数组的名字除了在做sizeof的参数之外,其他时候都是指向数组下表为0的元素,例子,a【10】,×a就是a【0】 char (*c)[5];等价于 char c[ ][5];,所以c等价于c[0],*c等价于c[0][0],取第iIndex个的值就是c[0][iIndex]也就是×(c[0][0] + index)也就是*((*c) + iIndex)
你好,你说"char (*c)[5];等价于 char c[ ][5];",但是在char * testA_A()函数中,是static char chArray[5],而不是static char chArray[?][5]数组...
LM165678 2018-01-25
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组
赵4老师 2018-01-22
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组
LM165678 2018-01-21
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
理解讨论之前请先学会如何观察! 仅供参考:
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
你好,我知道复合类型指针的意义,char (*(*x[3])())[5]中声明的那个x变量,它是一个数组指针,每个元素都是一个指针,这种指针可以指向一个函数,这种函数的返回值也是一个指针,这种指针指向一个长度为5的数组,x变量就是可以保存这种"[一个数组指针,每个元素都是一个指针,这种指针可以指向一个函数,这种函数的返回值也是一个指针,这种指针指向一个长度为5的数组]"类型的指针。对吧
LM165678 2018-01-21
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
理解讨论之前请先学会如何观察! 仅供参考:
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]
很明显x变量是一个复合类型的指针变量对象,对吧,我知道复合类型的指针描述,但是不理解我所提出的问题所在
sky065530 2017-12-12
  • 打赏
  • 举报
回复
《C专家编程》和《C陷阱和缺陷》里面有详细的讲解,可以去看看
sky065530 2017-12-11
  • 打赏
  • 举报
回复
数组的名字除了在做sizeof的参数之外,其他时候都是指向数组下表为0的元素,例子,a【10】,×a就是a【0】 char (*c)[5];等价于 char c[ ][5];,所以c等价于c[0],*c等价于c[0][0],取第iIndex个的值就是c[0][iIndex]也就是×(c[0][0] + index)也就是*((*c) + iIndex)
赵4老师 2017-12-11
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 仅供参考:
//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return #
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧