标题:[原创]C迷你问题:什么指针没有类型?(不含void 型)
只看楼主
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 17:58
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
哎,我的考虑不周全。
函数指针是有类型的。

理由:
我原先说函数指针是没类型的,当时我是这么想的:

在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量, 使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。
所以我想,既然都是指向内存的某个地址,而且存放的格式也完全一样,那么什么指针不都一样都能指向那块地方?

然而我却漏了个非常重要的元素没有考虑,那就是这个函数的返回值。返回值的类型决定了函数的类型。

看看下面的程序,在GCC4.0下没有任何的警告。

#include "stdio.h"

int add(int a, int b){
    return a+b;
}

void showAdd(int a, int b){
    printf("result = %d\n",a+b);
}

int main(void){
    int (*point)(),result;
        point = add;
        result = (*point)(1,2);
        printf("result = %d\n",result);
    return 0;
}

我们可以看到,我们把(*point)()和result均定义为int类型的变量,其中point是int类型的指针变量。如果说point指针是无类型的,那么我们可以顺利的把point重定位指向showAdd这个函数。我们看看

#include "stdio.h"

int add(int a, int b){
    return a+b;
}

void showAdd(int a, int b){
    printf("result = %d\n",a+b);
}

int main(void){
    int (*point)(),result;
        point = showAdd;
        (*point)(1,2);
    return 0;
}


编译结果:
[vlinux@localhost ~]$ gcc -o test test.c
test.c: 在函数 ‘main’ 中:
test.c:13: 警告:从不兼容的指针类型赋值

很遗憾,竟然在point = showAdd;这句出现了指针类型赋值警告:不兼容的指针类型赋值,呵呵



淘宝杜琨
2006-07-14 18:07
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
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 18:13
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 18:17
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
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 18:19
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
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 18:24
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
int a[3][4][5][6];
int (*p)[5][6];
p=&a; 应为p=*a;
改为p=*a ?
老兄啊! 改为p=*a 不就又多出了一唯了啊!

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



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




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

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