标题:[原创]C迷你问题:什么指针没有类型?(不含void 型)
取消只看楼主
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
以下是引用baidu在2006-7-14 15:32:45的发言:
同理

int (*p);
C语言并没有给他加上什么帽子,就是没有给他什么类型了。看他前面就是一个*号,
前面的int 可不是他的类型,而是数据的类型

大斑竹啊:
我前面也说了,你这里的 int (*p) 中的括号不是公式,而是可选加上去的括号。(C中,在很多地方是可以加上括号的,尽管,有时有意加上多余的括号。但编译器只解释为 int *p 公式)
在 int (*p)[n]和 int (*p)() 中的()是一定要加的。。



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 15:53
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
TO 穆扬:
能不能给出理由?

我觉得其他方面我不敢说(刚才想到,比如函数类型,函数的参数等等。。)
但是我下面的例子:道理是没错的吧
char str[128]={..};
char *p1=str;
int in[128]={...};
int *p2=in;
void *p=p1; // 显得多余 (这里我漏掉了,应该是void *p=(void *)p1;) 严重的概念错误
p2=p1; // 这里应该是 p2=(int *)p1

可以直接:
p2=(int *)p1;

[此贴子已经被作者于2006-7-14 16:08:24编辑过]


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 16:00
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 

TO BAIDU 大斑竹:
你的 有关 int (*p) 例 是不是 用来 用归谬法 来驳斥我的有关 int (*p)()<指向函数的指针>?
我理解,应该是这个意图吧?

但是,你的这个例证,应该是一种偷换概念吧?
因为,这里 int (*p) 只是其形,实质却是 int *p (编译器所最终解释为的)
所以,应该归谬无效啦。。

《测试了几遍了》
比如TC类,
你这样是非法的:
char ch[2][3]={'a','b','c','d','e','f'};
char *p=ch; //会警告
规范的是:char *p=ch[0];

这里,想再重复一下我的帖子的主题:
没有类型的指针可能是指向函数的指针:
int (*p)() // 这里 穆扬说应该是 int (*p)(char 等等)。这个应该都是可以的,正如在申明函数时
既可 int func(int) 也可 int func(int a) .
P前面的*号,是他唯一的标记,前面的 INT 当然不是指针的而是其指向的函数的返回类型。

如有看法意见,当然提出来一起互相讨论学习,尽力追求到接近真实的道理吧。。

TO 穆扬:
你的对VOID *的意见使我纠正了对VOID *的有些部分的仓促的观点

问题,经过互相讨论甚至论辩,才有提高的。。。


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 16:32
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
以下是引用穆扬在2006-7-14 15:55:51的发言:

我认为不会有任何警告,尽管我手头没有TC的编译器
如果有的话,那也只说明tc中有bug

测试了几遍了,是这样的
你可以找几个严禁一点的编译器试试。。
这是TC系列的严谨,不是BUG。。


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 16:34
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
刚刚看了 BAIDU 斑竹 的意见,我对我的观点重新思考了一下:
如果说函数的类型就是其返回值的类型,那么指向函数的指针的类型是不是就是指向的函数的类型?
哈哈! 这个问题有绕回来了?


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 16:42
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
你不警告?
我TC2,TC3都警告啊

TC3 是 可疑的指针转换

TC2 是 可疑的指针转换在函数MAIN中
代码:
#include <stdio.h>
void main(){
char a[2][3]={'a','b','c','d','e','f'};
/* char *p=a[3]; */
char (*p2)[5]=a; /* 这里*/
printf("%c\n",*(p2+1));
}

有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 16:55
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 

刚才试了 TC2,TC3
char a[2][3]={'a','b','c','d','e','f'};
char (*p2)[3]=a; /* 这里*/
这样就没问题
换成5就不行!

这里,我感觉应该分为2个C规范问题:
1 指针是否可指向数组
其中指针暂分为2种:
A
一般指针
B
XXX (*p)[N] 的指针

2 XXX (*p)[N] 中的N是否有限制

*****************************************

测试了以后,我初步感觉:
1-A
char a[2][3]={'a','b','c','d','e','f'};
char *p=a; // 警告
char *p=a[0]; // 可以
在TC中最多只能指向一唯数组名(换句话说,不能指向多唯数组)这一点正说明说明了一般指针不能指向数组,

(重要!:因为,如果真是能指向数组,就应该没有几唯的限制 !)

这里的能指向一唯数组,也只能理解为TC编译器仅对一唯数组
作了通融(或者,这样说更好理解:在C中,一唯数组名就表示第一元素的地址)

char a[]={'a','b','c','d','e','f'};
char *p=a;
有些被认为是指针可以“指向多唯数组”的编译器,如VC,我理解实际上是自动把他转为第一元素的地址罢了

1-B
既然可以指向一唯数组,那么XXX (*p)[N] 这种指针就可指向二唯了,因为他本身就有一唯了:
char a[2][3]={'a','b','c','d','e','f'};
char (*p2)[3]=a; /* 这里*/
因为,你可以试一下:
char a[2][3][4]={'a','b','c','d','e','f'。。。。};
char (*p2)[4]=a;
不用去试,应该是不行的!如果行,就说明我的观点不对了。

2
XXX (*p)[N] 中的N是否有限制
发现在TC中,作了严格限制,N如不等于数组的最先一唯的数,就警告!:
(我想,C规范肯定没有这一条,TC中作此限制,只能理解为避免程序员的疏漏吧)
char a[2][3]={'a','b','c','d','e','f'};
char (*p)[3]=a; //可以
char (*p)[4]=a; //警告
char (*p)[4]=&a[0] //这样也警告

我觉得这样的限制减弱了XXX (*p)[N] 型指针的灵活性和威力。因为本来 这个N是自由的,这样灵活性和威力更大
有些编译器就没有限制。。

******************************
小总结: 指针实质上不是指向数组,实质上是仅指向第一元素。

[此贴子已经被作者于2006-7-14 18:01:30编辑过]


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 17:49
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 

穆扬老兄啊!
我前面说了
int a[3][4];
int (*p)[4]=a
可以,那是因为 他本身已含有了一唯了啊!
int a[3][4];
int *p=a;
这样才是不含唯数的,是要警告的。。

int a[3][4];
int (*p)[3][4];
p=&a;

你这个int (*p)[3][4]; 本身就含有两唯啦! 那当然可以啦!

你试试
int a[3][4][5];
int (*p)[3][4];
p=&a;
看行不行?
如果不警告,就是你对啦!

[此贴子已经被作者于2006-7-14 18:13:22编辑过]


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 18:07
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
哦,我刚才讲错了:更正一下:
你试试
int a[3][4][5][6];
int (*p)[5][6];
p=&a;
看行不行?
如果不警告,就是你对啦!

就是说:
下面比上面少一唯是可以的,再少就不行了
如果说,指针能指向数组,不管少几唯都可以。。。

有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 18:17
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
这样说吧


如果指针能指向数组的话,
不要说int (*p)[5]; 等等本身含有唯数的指针 就是不含有任何唯数的普通指针都可以指向任意多个唯数的数组!


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 18:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-78155-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053298 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved