标题:[原创]C迷你问题:什么指针没有类型?(不含void 型)
只看楼主
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
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
得分:0 

咬文嚼字啊,米意思


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-07-14 14:47
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
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
以下是引用grub2linux在2006-7-14 14:49:14的发言:

实际上,不存在指向数组的指针,只存在指向数组第一个元素的指针。
所以,在有些严格的编译器,比如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 可不是他的类型,而是函数的类型。

匪异所思


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-07-14 15:01
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
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 

照你的理论
int (*p);

int * p;
是两个不同的东西?


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-07-14 15:10
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
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
唉,什么编译器里 int (*)p; 会报错?

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-07-14 15:17
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
得分:0 
是int (*p);

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-07-14 15:18
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



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




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

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