鱼C论坛

 找回密码
 立即注册
查看: 3834|回复: 16

[技术交流] 指针与数组的疑难杂症(有大大的赏金)

[复制链接]
发表于 2016-6-14 16:30:20 | 显示全部楼层 |阅读模式
33鱼币
本帖最后由 阁龙1427 于 2016-6-22 10:07 编辑

1-
int array[10] = {0,1,2,3,4,5,6,7,8,9};
int (*ptr)[3] = (int (*)[3])&array;

ptr[1][2] = ?;
2-
int array[10] = {0,1,2,3,4,5,6,7,8,9};
int *ptr = (int *)(&array + 1);
*(ptr-6) = ?;
3-
void ( *fun (int, void(*) (int) ) ) (int)
4-
char * const*(*next)()
5-
char *(*ptr[8])(char *p)
6-
char *(*(*ptr)[8])(char *p)

对C语言的声明、指针数组、数组指针、函数指针、二级指针、强制类型转换的理解;

欢迎大家前来探讨自己的理解。

最佳答案

查看完整内容

你这样写,一定会被写程序的组长骂。没有任何意义。仅仅由于学习装逼。 第一个程序int (*ptr)[3] = (int (*)[3])&array;就是把array分成一个3*3,名字改为ptr的数组。这个即即是方便书写。; 第二个int *ptr = (int *)(&a+1);中的+1不是真的加了个1,而是整个数组最后一个的那个数再后面一个的位置给ptr,那么*(ptr-6)想想都知道是4,这个也是没有什么实际的作用,就是书写方便; 第三个void ( *fun (int, void(*) (int) ) ) ...

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
小甲鱼 + 5 + 5 + 5 好题目~~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 16:30:21 | 显示全部楼层
本帖最后由 zhoushilei 于 2016-6-14 19:26 编辑

你这样写,一定会被写程序的组长骂。没有任何意义。仅仅由于学习装逼。
第一个程序int (*ptr)[3] = (int (*)[3])&array;就是把array分成一个3*3,名字改为ptr的数组。这个即即是方便书写。;
第二个int *ptr = (int *)(&a+1);中的+1不是真的加了个1,而是整个数组最后一个的那个数再后面一个的位置给ptr,那么*(ptr-6)想想都知道是4,这个也是没有什么实际的作用,就是书写方便;
第三个void ( *fun (int, void(*) (int) ) ) (int) 首先要知道的是这个基础.void(*) (int)是void(*一个指针的名字)(int),相当于是一个指向一个以int作为参数的成员的函数的指针,比如说这个指void (*p)(int);
void add(int i){i++;} p=add;  只要这个之后你可以知道void(*)(int)这里放的是个函数指针;再来看看void ( *fun (int, void(*) (int) ) ) (int) ,简化为void (*fun(int,函数指针))(int),那么这个和上面是同理的。fun(int,函数指针)是一个返回一个指针名字的函数,就是void(*一个返回函数名字的函数)int,这个返回的名字会指向另一个参数为int的函数。  这个东西也是一样,实际上没有任何作用。

评分

参与人数 3荣誉 +11 鱼币 +9 贡献 +6 收起 理由
tianzhiya + 1 + 1 支持楼主!
小甲鱼 + 5 + 5 + 3 哈哈,人才!
阁龙1427 + 5 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 19:13:33 | 显示全部楼层
在《C程序设计语言》中,指针和数组是放在同一章讲的,所以 ...  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 19:29:10 | 显示全部楼层
第四个  如果能搞懂第三的个画 那么第四个也不难的char *(*p[8])(char *p)就是p[8]这个数组里面的作为函数名来指向 8个char xxxxx(char *p)的函数,同时这个函数以p数组为名 又作用于p数组,以p为参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 19:35:10 | 显示全部楼层
第5个也是一样的由于优先级  相当于是char *(*(*p)[8])(char *p) char*(*(里面一坨)(char*p)。这个和第四个是一样的,那么(*p)[8]是什么呢由于()优先级高,所以先做*p,那么*p是一个数组的名字,p是一个指向数组名字的指针。这样的画(*p)[8]就是(一个数组的名字p指向的)那么其余的和第4个同理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 22:39:22 | 显示全部楼层
写代码除了给编译器看
还要给人看
可以有100种混乱代码写出 hello word 这东西国际上代码混乱大赛有的是

如果写出的代码为了凸显高逼格 完全可以用内敛汇编去写

如果代码的可读性极其差 抛开特有的算法
简单的语法都要要别人一眼都看不懂 要费尽去解读 这样的代码和废品是直接划等号的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-15 09:46:00 | 显示全部楼层
ryxcaixia 发表于 2016-6-14 22:39
写代码除了给编译器看
还要给人看
可以有100种混乱代码写出 hello word 这东西国际上代码混乱大赛有的是
...

主要是理解编程思想,而不是要求去这样写代码。
void ( *fun (int, void(*) (int) ) ) (int)
linux 有一些标准的代码就是这样构造的,目的不是为了去让别人看不懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-15 09:54:23 | 显示全部楼层
晦涩难懂的语句 完全看不到任何编程思想在其中

如果一定要理解指针
记住一句话就行
指针的类型决定了指针的视野, 指针的视野决定了指针的步长

int array[10] = {0,1,2,3,4,5,6,7,8,9};
array可以看成是一级指针int*, 他的步长(每次加1减1)是每次偏移4个字节, 即一个int元素
&array可以看成是一个二级指针int**, 他的步长(每次加1减1)是每次偏移sizeof(array)个字节, 即整个数组的步长 至于为什么跨越的刚好是40个字节, 因为你在栈上开辟的一维数组编译器会自动记下他的维度

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
阁龙1427 + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-16 11:33:36 | 显示全部楼层
拿点鱼币

评分

参与人数 1鱼币 -10 收起 理由
小甲鱼 -10 请不要无意义灌水!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-17 16:41:05 | 显示全部楼层
头脑风暴啊,用于加强对指针的理解确实不错。

PS:借两道题来做课后作业哈~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-18 00:33:54 | 显示全部楼层
看不懂

评分

参与人数 1贡献 -1 收起 理由
阁龙1427 -1 请不要无意义评论

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-18 15:08:29 | 显示全部楼层
zhoushilei 发表于 2016-6-14 19:29
第四个  如果能搞懂第三的个画 那么第四个也不难的char *(*p[8])(char *p)就是p[8]这个数组里面的作为函数 ...

不好意思,写错了。应该是
char *(*ptr[8])(char *p)
同时应该是这8个数组元素指向的是
char *fun_name (char *p)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-18 16:35:32 | 显示全部楼层
zhoushilei 发表于 2016-6-14 19:29
第四个  如果能搞懂第三的个画 那么第四个也不难的char *(*p[8])(char *p)就是p[8]这个数组里面的作为函数 ...

这个不好意思写错了,其实是回调函数用的,
对数组赋值应该是
ptr[0] = function0_address;
ptr[1]= function1_address
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-18 16:36:49 | 显示全部楼层
ryxcaixia 发表于 2016-6-15 09:54
晦涩难懂的语句 完全看不到任何编程思想在其中

如果一定要理解指针

“指针的类型决定了指针的视野, 指针的视野决定了指针的步长”这句话非常精彩,请允许我摘录到课后作业中~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-18 16:44:21 | 显示全部楼层
zhoushilei 发表于 2016-6-14 19:35
第5个也是一样的由于优先级  相当于是char *(*(*p)[8])(char *p) char*(*(里面一坨)(char*p)。这个和第四 ...

这个赋值是这样的:

ptr[0][0]= function00_address;
ptr[0][1] = function01_address;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-20 10:17:58 | 显示全部楼层
小甲鱼 发表于 2016-6-18 16:36
“指针的类型决定了指针的视野, 指针的视野决定了指针的步长”这句话非常精彩,请允许我摘录到课后作业中 ...

嘿嘿~ 必须可以啊
本科时代 院长讲c语言指针的时候 如是说 "没指望你们大学毕业前能彻底理解指针 先记下来 以后慢慢理解"
辛勤的老院长
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-15 12:14:16 | 显示全部楼层
实践是检验真理的唯一标准
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 07:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表