不管多少级指针都可以用两个函数搞定,不再为三级以上的指针费脑筋了,大神看看我写的对不对.(警告什么的请无视)

说好一起扑成狗 2018-05-09 02:14:55

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* f1(char* p)
{
return p = (char*)malloc(sizeof(char*));
}

char* f2(char* p)
{
return p = (char*)malloc(sizeof(char));
}

int main(void)
{
char ****p4 = NULL;
char ***p3 = NULL;
char **p2 = NULL;
char *p1 = NULL;
char a = 'c';

p4 = f1(p4);
p3 = f1(p3);
p2 = f1(p2);
p1 = f2(p1);

*p4 = p3;
*p3 = p2;
*p2 = p1;
*p1 = a;
printf("****p4 = %c\n", ****p4);
printf("*p1 = %c\n", *p1);
printf("a = %c\n", a);
return 0;
}

三级以上的指针,写起来晕头转向的,
所以,想一劳永逸的解决多级指针的问题,
无论多少级指针,这两个函数都可以搞定.
(在此基础上,改改应该可以实现指针数组,数组指针,结构体多级指针...)
警告是因为指针不匹配,忽略就好.
特别希望得到大神的批评指正,如果有更好的实现方法,希望不吝赐教.
...全文
916 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
警告是必然的,C语言层面的限制.

他的模型是这样的.

为什么多此一举要在堆里开辟一块内存,
这样你就可以用一个指针(各种各样的指针),例如:数组指针,结构体指针,函数指针,
在多级操作下找一个通用的方法.(心里的想法,用我这匮乏的汉语言很难表述清楚啊!)
  • 打赏
  • 举报
回复
引用 10 楼 donjin9 的回复:
我这边vs2008 2015都报错了?? error C2664: “char *f1(char *)”: 无法将参数 1 从“char ****”转换为“char *” note: 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
我是这样理解的: char * 和char ***********(无论多少个*)里面存放的都是一个地址啊.本质上无区别. 你可能把警告都改成错误了,所以无法编译通过.(你这是个好习惯.)
  • 打赏
  • 举报
回复
有警告是必然的. char* 和char ** 以及 char*** 之所以有警告,是要对应相应的类型吧. 一级指针,就应该指向一级地址. 二级指针就应该指向二级地址. N级指针就应该指向N级地址. char (*p)[]指向二级数组地址. char p(void)指向函数地址. 虽然他们本质上都是指向地址.但指向的意义是不一样的. 我猜(猜是不对的)这是C语言的限制,在汇编的层次和角度看,应该没有这限制.(反正都是地址嘛.)
donjin9 2018-05-11
  • 打赏
  • 举报
回复
我这边vs2008 2015都报错了?? error C2664: “char *f1(char *)”: 无法将参数 1 从“char ****”转换为“char *” note: 与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
  • 打赏
  • 举报
回复
引用 8 楼 donjin9 的回复:
我咋编译不过呢?
不可能啊,大哥.都是编译运行的.在vs2013和dev-c下都可以的.
donjin9 2018-05-10
  • 打赏
  • 举报
回复
我咋编译不过呢?
wallesyoyo 2018-05-10
  • 打赏
  • 举报
回复
你这两个函数的参数没啥用啊貌似。
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <typeinfo.h>
char num[5];
char(*x00())[5]
{
	return #
}
int main()
{

	char(*(*x[3])())[5];//是个数组,大小为3
	//令 a = x[3];
	char(*(*a)())[5];//数组的元素,是个函数指针
	//令b = *a;
	char(*(b)())[5];//函数原型,参数为空,返回值为指针
	//令c = (b)();
	char(*c)[5];//返回值

	printf("typeid(x).name() is %s\n", typeid(x).name());
	getchar();
	return 0;
}
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
char (*(*x[3])())[5];//x是什么类型的变量? ————程序顺利通过编译,运行结果正确!
哈哈,这个你可能不到我.我先回答赵老师这个问题. 我有更科学的解答方法.就是数学方法. char (*(*x[3])())[5];//x是什么类型的变量? 令 u = (*(*x[3])()) ; 则有 char u[5],显然他最后是一个大小为5的数组.然后我们去掉两边的大括号:*(*x[3])() 再令 p =(*x[3]);则有 *p(),显然他是一个返回值为void*,无参数的函数指针.再去掉两边的大括号 *x[3] *x[3]显然,x是一个大小为3的指针数组,指向void类型. 这就分解完毕了. 让我再想想怎么组合语句.脑壳痛.
  • 打赏
  • 举报
回复
引用 1 楼 wyyy2088511 的回复:
哈哈,想法很好,但是p4指向一个空间,p4又指向p3地址!例如这样的问题都是这样!


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char *p = NULL;
char a = 'c';
p = &a;
//一个指针p的三个"地址".
printf("&p = %p\n", &p);//指针p自身的地址.
printf("p = %p\n",p);//指针p指向的地址 = &a.
printf("*p = %p\n", *p);//指针p指向的地址的内容.
printf("-------\n");
printf("&a = %p\n", &a);//p = &a;
printf("a = %p\n", a); //*p = a;
return 0;
}

赵4老师 2018-05-09
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察
//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]
《牛肉干》 C语言上机课,某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上,卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子: int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译,运行结果正确!
  • 打赏
  • 举报
回复
引用 1 楼 wyyy2088511 的回复:
哈哈,想法很好,但是p4指向一个空间,p4又指向p3地址!例如这样的问题都是这样!
p4分配了一个空间,空间里放着p3的地址. 你说错了.
jena_wy 2018-05-09
  • 打赏
  • 举报
回复
哈哈,想法很好,但是p4指向一个空间,p4又指向p3地址!例如这样的问题都是这样!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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