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

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

热度:167   发布时间:2006-07-14 17:58:00.0
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-14 09:58:00
神vLinux飘飘

等 级:贵宾
威 望:87
帖 子:6111
专家分:49
注 册: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;这句出现了指针类型赋值警告:不兼容的指针类型赋值,呵呵



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

穆扬老兄啊!
我前面说了
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编辑过]


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

2006-07-14 10:13:25
穆扬

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

2006-07-14 10:17:37
grub2linux

等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
  得分:0 
哦,我刚才讲错了:更正一下:
你试试
int a[3][4][5][6];
int (*p)[5][6];
p=&a;
看行不行?
如果不警告,就是你对啦!

就是说:
下面比上面少一唯是可以的,再少就不行了
如果说,指针能指向数组,不管少几唯都可以。。。

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

2006-07-14 10:19:46
grub2linux

等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
  得分:0 
这样说吧


如果指针能指向数组的话,
不要说int (*p)[5]; 等等本身含有唯数的指针 就是不含有任何唯数的普通指针都可以指向任意多个唯数的数组!


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

2006-07-14 10:24:29
grub2linux

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

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