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

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

热度:204   发布时间:2006-07-14 16:34:58.0
以下是引用穆扬在2006-7-14 15:55:51的发言:

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

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


----------------解决方案--------------------------------------------------------
刚刚看了 BAIDU 斑竹 的意见,我对我的观点重新思考了一下:
如果说函数的类型就是其返回值的类型,那么指向函数的指针的类型是不是就是指向的函数的类型?
哈哈! 这个问题有绕回来了?


----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 08:44:45
baidu

等 级:新手上路
威 望:8
帖 子:3812
专家分:0
注 册:2005-11-4
  得分:0 
#include
以下是引用grub2linux在2006-7-14 16:34:58的发言:

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

#include<stdio.h>
int main()
{
int a[3][5]={1,2,3,4,5,6,7,8,9,0,1,2,3,4,5};
int (*p)[5]=a;
p++;
printf("%d\n",*(int*)p);
p++;
printf("%d\n",*(int*)p);
return 0;
}

奇怪,我特意用TC试了一下,没警告,没错误,不知道你是怎么测试的,贴上代码。


----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 08:46:56
grub2linux

等 级:新手上路
帖 子: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));
}
----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 08:57:01
baidu

等 级:新手上路
威 望:8
帖 子:3812
专家分:0
注 册:2005-11-4
  得分:0 

----------------解决方案--------------------------------------------------------
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 09:02:20
grub2linux

等 级:新手上路
帖 子: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编辑过]


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