当前位置: 代码迷 >> C语言 >> [原创]C迷你问题:什么指针没有类型?(不含void 型)
  详细解决方案

[原创]C迷你问题:什么指针没有类型?(不含void 型)

热度:130   发布时间:2006-07-14 13:52:36.0
以下是引用穆扬在2006-7-13 20:49:01的发言:
除了void *
所有指针都有类型

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

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

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


----------------解决方案--------------------------------------------------------

咬文嚼字啊,米意思


----------------解决方案--------------------------------------------------------
以下是引用穆扬在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 可不是他的类型,而是函数的类型。


----------------解决方案--------------------------------------------------------
以下是引用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 可不是他的类型,而是函数的类型。

匪异所思


----------------解决方案--------------------------------------------------------
这可不是咬文嚼字,类型是有具体功能的。

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

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

----------------解决方案--------------------------------------------------------

照你的理论
int (*p);

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


----------------解决方案--------------------------------------------------------
没有 int (*p);
只有 int (*p)[n] 和 int (*p)()
前者是P指向有N个元素组成的一唯数组
后者是P指向函数



----------------解决方案--------------------------------------------------------
唉,什么编译器里 int (*)p; 会报错?
----------------解决方案--------------------------------------------------------
是int (*p);
----------------解决方案--------------------------------------------------------
我上面说的是C的规范啊,当然不是我的理论啊。。。
哦,补充一下,严谨一点:
我说 没有 int (*p),并不是说 不可以写成这样(在C中,很多地方是可以加上括号的,即使有的时候无实际意义),但是他跟公式是两回事

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

应该说的较清楚了吧




----------------解决方案--------------------------------------------------------
  相关解决方案