标题:[原创]C迷你问题:什么指针没有类型?(不含void 型)
取消只看楼主
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
 问题点数:0 回复次数:22 
[原创]C迷你问题:什么指针没有类型?(不含void 型)
大家,先想想,以后我再说答案。。。
搜索更多相关主题的帖子: void 指针 类型 
2006-07-13 19:47
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
哈哈! 不愧是斑竹啊!。。。

有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-13 20:35
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
以下是引用穆扬在2006-7-13 20:49:01的发言:
除了void *
所有指针都有类型

1 void * 类指针 不是已说明了是void 类型?

2 那你说指向函数的指针是什么类型?(说类型是“函数指针类型”,这可不行哦!)

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


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 13:52
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
以下是引用穆扬在2006-7-13 21:30:21的发言:
也问,指向数组的指针的类型是什么?

实际上,不存在指向数组的指针,只存在指向数组第一个元素的指针。
所以,在有些严格的编译器,比如TC类,
你这样是非法的:
char ch[2][3]={'a','b','c','d','e','f'};
char *p=ch; //会警告
规范的是:char *p=ch[0];

对于“类型”这一概念,其含义是多种多样的:
至少:
1 对于一般变量和常量,是表示内存的占据容量,比如 INT 占据两个字节等等。
2 对于指针就是指他指向的数据类型,这用来进行地址运算的。如果是指向INT ,那么指针+1就是移动2个字节。。。
而不是他本身占据的容量。
因为,不管指向什么类型,指针的容量都是 unsigned long(这样,指针最大可指向2的32次方的内存,即4GB内存)
所以,实际上指针就是一个unsigned long变量。
所以,既然这样,你也可以把一个普通的unsigned 的整形变量强迫为一个指针,他就可以指向一个内存地址了:
unsigned int a=12345;
char *p=(char *)a;
当然,内存12345处是个不可知数。
如果你对内存很了解,你可以这样查看内存,甚至修改内存值(仅限于纯DOS)

补充: 如果指针指向函数:
int func(char c)
{
...
}
int (*p)();
p=func;
这种情况,C语言并没有给他加上什么帽子,就是没有给他什么类型了。看他前面就是一个*号,
前面的int 可不是他的类型,而是函数的类型。


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 14:49
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
这可不是咬文嚼字,类型是有具体功能的。

其实,C语言的 void * 型指针没有什么实际意义,只是考虑到可读性。
因为由于C已经非常灵活了,几乎绝大多数的东东都可以转来转去的,当然有些敏感的类型需要固定的标识符处理。。
用void * 却显得有些多余:
比如:
char str[128]={..};
char *p1=str;
int in[128]={...};
int *p2=in;
void *p=p1; // 显得多余
p2=p1;

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

有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 15:03
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
没有 int (*p);
只有 int (*p)[n] 和 int (*p)()
前者是P指向有N个元素组成的一唯数组
后者是P指向函数



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 15:14
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
我上面说的是C的规范啊,当然不是我的理论啊。。。
哦,补充一下,严谨一点:
我说 没有 int (*p),并不是说 不可以写成这样(在C中,很多地方是可以加上括号的,即使有的时候无实际意义),但是他跟公式是两回事

既然是规格公式,就一定要加的。。
所以,我是说没有 int (*p)这个公式。有 int (*p)[n] 和 int (*p)() 两种公式

应该说的较清楚了吧




有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 15:29
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
你能不能说说理由呢?
我上面是说了根据的啊
根据:
在有些严格的编译器,比如TC类,
你这样是非法的:
char ch[2][3]={'a','b','c','d','e','f'};
char *p=ch; //会警告 如果指针能指向数组,这里就不会警告。之所以有很多人误以为可以指向数组。主要是因为有些编译器(比如,VC等)不严格,或者说自动帮你转换成了指向相应的第一元素了。。可以多试试一些编译器,就会得到验证。
规范的是:char *p=ch[0];

[此贴子已经被作者于2006-7-14 15:36:40编辑过]


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

int a[3][5]={...};
int (*p)[5]=a;
这在TC系列中是会警告的: suspicios pointer conversion 可疑的指针转换

在VC等不严格遵守C规范的编译器就没警告。。


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-07-14 15:42
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
TO baidu 大斑竹:
你怎么把 我说的 int (*p)() 说成 int (*p) 了?
这是两回事啊!




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



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




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

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