指针与数组的疑难杂症(有大大的赏金)
本帖最后由 阁龙1427 于 2016-6-22 10:07 编辑1-
int array = {0,1,2,3,4,5,6,7,8,9};
int (*ptr) = (int (*))&array;
ptr = ?;
2-
int array = {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)(char *p)
6-
char *(*(*ptr))(char *p)
对C语言的声明、指针数组、数组指针、函数指针、二级指针、强制类型转换的理解;
欢迎大家前来探讨自己的理解。 本帖最后由 zhoushilei 于 2016-6-14 19:26 编辑
你这样写,一定会被写程序的组长骂。没有任何意义。仅仅由于学习装逼。
第一个程序int (*ptr) = (int (*))&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的函数。这个东西也是一样,实际上没有任何作用。 在《C程序设计语言》中,指针和数组是放在同一章讲的,所以 ...{:10_256:} 第四个如果能搞懂第三的个画 那么第四个也不难的char *(*p)(char *p)就是p这个数组里面的作为函数名来指向 8个char xxxxx(char *p)的函数,同时这个函数以p数组为名 又作用于p数组,以p为参数 第5个也是一样的由于优先级相当于是char *(*(*p))(char *p) char*(*(里面一坨)(char*p)。这个和第四个是一样的,那么(*p)是什么呢由于()优先级高,所以先做*p,那么*p是一个数组的名字,p是一个指向数组名字的指针。这样的画(*p)就是(一个数组的名字p指向的)那么其余的和第4个同理。
写代码除了给编译器看
还要给人看
可以有100种混乱代码写出 hello word 这东西国际上代码混乱大赛有的是
如果写出的代码为了凸显高逼格 完全可以用内敛汇编去写
如果代码的可读性极其差 抛开特有的算法
简单的语法都要要别人一眼都看不懂 要费尽去解读 这样的代码和废品是直接划等号的 ryxcaixia 发表于 2016-6-14 22:39
写代码除了给编译器看
还要给人看
可以有100种混乱代码写出 hello word 这东西国际上代码混乱大赛有的是
...
主要是理解编程思想,而不是要求去这样写代码。
void ( *fun (int, void(*) (int) ) ) (int)
linux 有一些标准的代码就是这样构造的,目的不是为了去让别人看不懂。 晦涩难懂的语句 完全看不到任何编程思想在其中
如果一定要理解指针
记住一句话就行
指针的类型决定了指针的视野, 指针的视野决定了指针的步长
int array = {0,1,2,3,4,5,6,7,8,9};
array可以看成是一级指针int*, 他的步长(每次加1减1)是每次偏移4个字节, 即一个int元素
&array可以看成是一个二级指针int**, 他的步长(每次加1减1)是每次偏移sizeof(array)个字节, 即整个数组的步长 至于为什么跨越的刚好是40个字节, 因为你在栈上开辟的一维数组编译器会自动记下他的维度 拿点鱼币 {:10_307:} 头脑风暴啊,用于加强对指针的理解确实不错。
PS:借两道题来做课后作业哈~~ 看不懂 zhoushilei 发表于 2016-6-14 19:29
第四个如果能搞懂第三的个画 那么第四个也不难的char *(*p)(char *p)就是p这个数组里面的作为函数 ...
不好意思,写错了。应该是char *(*ptr)(char *p)
同时应该是这8个数组元素指向的是 char *fun_name (char *p) zhoushilei 发表于 2016-6-14 19:29
第四个如果能搞懂第三的个画 那么第四个也不难的char *(*p)(char *p)就是p这个数组里面的作为函数 ...
这个不好意思写错了,其实是回调函数用的,
对数组赋值应该是
ptr = function0_address;
ptr= function1_address ryxcaixia 发表于 2016-6-15 09:54
晦涩难懂的语句 完全看不到任何编程思想在其中
如果一定要理解指针
“指针的类型决定了指针的视野, 指针的视野决定了指针的步长”这句话非常精彩,请允许我摘录到课后作业中~ zhoushilei 发表于 2016-6-14 19:35
第5个也是一样的由于优先级相当于是char *(*(*p))(char *p) char*(*(里面一坨)(char*p)。这个和第四 ...
这个赋值是这样的:
ptr= function00_address;
ptr = function01_address; 小甲鱼 发表于 2016-6-18 16:36
“指针的类型决定了指针的视野, 指针的视野决定了指针的步长”这句话非常精彩,请允许我摘录到课后作业中 ...
嘿嘿~ 必须可以啊
本科时代 院长讲c语言指针的时候 如是说 "没指望你们大学毕业前能彻底理解指针 先记下来 以后慢慢理解"
辛勤的老院长
实践是检验真理的唯一标准
页:
[1]