鱼C论坛

 找回密码
 立即注册
查看: 1761|回复: 15

指针问题求助————望各位大大不吝赐教—————————————————————

[复制链接]
发表于 2014-3-7 15:48:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
void main ()
{
        int *p[6]={1,2,3,4,5,6};
        int c,a,d;
        c=p[3];
        a=p[1];
        d=p[3]-p[1];
        printf("%d\n%d\n",c-a,d);
}
c-a的答案是2,而d的答案却是0,问题出在了哪里————先谢谢来帮忙的大大们————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-7 16:29:15 | 显示全部楼层
*p[6]是个2维数组 ,然后自己再考虑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 19:08:01 | 显示全部楼层
其实你这么写在C++里面会严重报错的~~~。
不过在C里面勉强通过,肯定还是会告诉你类型不匹配之类的警告

int *p[6] 其实就是如下:
for(int i=0;i<6;i++)
{
    p[i] = (int *)malloc(sizeof(int)*10);
}
你又给其赋值为{1,2,3,4,5,6}。 自己再想想看吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 21:49:17 | 显示全部楼层
如此神奇的程序,1.2.3.4.5.6做指针,不理解。。。
你把俩指针加加减减,这。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 22:08:57 | 显示全部楼层
改成这样就好了

        int p[6]={1,2,3,4,5,6};
                int c,a,d;
                c=p[3];
                a=p[1];
                d=p[3]-p[1];
                printf("%d\n%d\n",c-a,d);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 11:16:49 | 显示全部楼层

学长你好,这个程序我是在C++6.0里可以运行的, 后来我把d=p[3]-p[1]改成d=&p[3]-&p[1]。。这样结果就对了。。但是我还不是很理解,原来我是这样想的,你帮我看看哪里的概念是错误的,int *p[6] 是定义了6个指针数组,由6个指向整形的指针元素组成,因为我在一本书上看见过,指针是可以相减的,那么c=p[3],这样子的是可以把指针内的值给c的,那么p[3]-p[1]也是可以的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 11:18:51 | 显示全部楼层
machimilk 发表于 2014-3-7 22:08
改成这样就好了

        int p[6]={1,2,3,4,5,6};

这样子我也知道。就是要做数组指针做才出了问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 11:21:48 | 显示全部楼层
zhongguoren 发表于 2014-3-7 21:49
如此神奇的程序,1.2.3.4.5.6做指针,不理解。。。
你把俩指针加加减减,这。。。。

你好,这样是1,2,3,4,5,6做了指针吗?我看到的书上是说,int *p[6]不是定义了指针数组?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 11:52:31 | 显示全部楼层
本帖最后由 Simanzen 于 2014-3-8 11:54 编辑

*p[6]是数组指针,其元素均为指向int数据类型的指针,你这样子定义int *p【6】={1,2,3,4,5,6,}相当于把const int 赋值给int *(即把常数赋值给指针),这是错误的,有些书是不可信的、错误的,lz要善于辨别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 13:24:45 | 显示全部楼层
Simanzen 发表于 2014-3-8 11:52
*p[6]是数组指针,其元素均为指向int数据类型的指针,你这样子定义int *p【6】={1,2,3,4,5,6,}相当于把cons ...

先谢谢你,那如果*p[6]是数组指针,那(*p)[6]呢,是不是说*p[6]是指向p[0],p[1]----p[5]的6个指针,(*p)[6]是指向整个数组的一个指针呢?。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 13:44:54 | 显示全部楼层
奔跑的鸭蛋 发表于 2014-3-8 11:18
这样子我也知道。就是要做数组指针做才出了问题。

非要用指针,这么写也行               
int p[6]={1,2,3,4,5,6};
int *m=p;
int c,a,d;
c=m[3];
a=m[1];
d=m[3]-m[1];
printf("%d\n%d\n",c-a,d);

你那种写法我vs2008根本没法编译
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-8 15:03:41 | 显示全部楼层
machimilk 发表于 2014-3-8 13:44
非要用指针,这么写也行               
int p[6]={1,2,3,4,5,6};
int *m=p;

我第一个程序是这样编的,我现在这个程序我把d=p[3]-p[1]换成d=&p[3]-&p[1]就可以了。还是很感谢你的帮助。{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 23:37:37 | 显示全部楼层
奔跑的鸭蛋 发表于 2014-3-8 13:24
先谢谢你,那如果*p[6]是数组指针,那(*p)[6]呢,是不是说*p[6]是指向p[0],p[1]----p[5]的6个指针,(*p) ...

int (*p)[6]是指向一维数组的指针,其元素是int型,“*p[6]是指向p[0],p[1]----p[5]的6个指针,”这个说法不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-8 23:41:57 | 显示全部楼层
路过看看= =!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-9 11:21:44 | 显示全部楼层
奔跑的鸭蛋 发表于 2014-3-8 11:21
你好,这样是1,2,3,4,5,6做了指针吗?我看到的书上是说,int *p[6]不是定义了指针数组?

是啊。但是你给指针数组赋值为1,2,3是做什么。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-28 10:32:57 | 显示全部楼层
这其实是一个很好的题目。不要认为他是错的。这里面涉及到很多隐藏的类型转换。
就拿这道题目来看

#include <stdio.h>
void main ()
{
        int *p[6]={1,2,3,4,5,6};
        int c,a,d;
        c=p[3];
        a=p[1];
        d=p[3]-p[1];
        printf("%d\n%d\n",c-a,d);
}
在c=p[3];  a=p[1];中 涉及到了一个 int* 强制转换int类型 c=4 a=2
在d=p[3]-p[1]; 中 先进行指针的相减 指针的相减对同一个数组来说有意义 对不同数组来说没有意义 这里的话 相当于 (int* (4) - int* (2)) / (sizeof(int)) = int*(0)  再进行一次强制转换 转换为int 0  
所以如果在数据中 int *p[6]={1,2,3,6,5,6};
那么 (int* (6) - int* (2)) / (sizeof(int)) = int*(1) 再进行一次强制转换 转换为int 1  
而如果为
#include <stdio.h>
void main ()
{
        char *p[6]={1,2,3,4,5,6};
        char c,a,d;
        c=p[3];
        a=p[1];
        d=p[3]-p[1];
        printf("%d\n%d\n",c-a,d);
}
在d=p[3]-p[1]; 中 先进行指针的相减 指针的相减对同一个数组来说有意义 对不同数组来说没有意义 这里的话 相当于 (char* (4) - char* (2)) / (sizeof(char)) = char*(2)  再进行一次强制转换 转换为 char 2

结论: 这种指针相加减的时候要考虑到他的类型 就相当于一个基 long*  +1 说明是4个字节的跨度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 11:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表