奔跑的鸭蛋 发表于 2014-3-7 15:48:42

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

#include <stdio.h>
void main ()
{
        int *p={1,2,3,4,5,6};
        int c,a,d;
        c=p;
        a=p;
        d=p-p;
        printf("%d\n%d\n",c-a,d);
}
c-a的答案是2,而d的答案却是0,问题出在了哪里————先谢谢来帮忙的大大们————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
   

oggplay 发表于 2014-3-7 16:29:15

*p是个2维数组 ,然后自己再考虑

双色保龄球 发表于 2014-3-7 19:08:01

其实你这么写在C++里面会严重报错的~~~。
不过在C里面勉强通过,肯定还是会告诉你类型不匹配之类的警告

int *p 其实就是如下:
for(int i=0;i<6;i++)
{
    p = (int *)malloc(sizeof(int)*10);
}
你又给其赋值为{1,2,3,4,5,6}。 自己再想想看吧。

zhongguoren 发表于 2014-3-7 21:49:17

如此神奇的程序,1.2.3.4.5.6做指针,不理解。。。
你把俩指针加加减减,这。。。。

machimilk 发表于 2014-3-7 22:08:57

改成这样就好了

        int p={1,2,3,4,5,6};
                int c,a,d;
                c=p;
                a=p;
                d=p-p;
                printf("%d\n%d\n",c-a,d);

奔跑的鸭蛋 发表于 2014-3-8 11:16:49

双色保龄球 发表于 2014-3-7 19:08 static/image/common/back.gif
其实你这么写在C++里面会严重报错的~~~。
不过在C里面勉强通过,肯定还是会告诉你类型不匹配之类的警告 ...

学长你好,这个程序我是在C++6.0里可以运行的, 后来我把d=p-p改成d=&p-&p。。这样结果就对了。。但是我还不是很理解,原来我是这样想的,你帮我看看哪里的概念是错误的,int *p 是定义了6个指针数组,由6个指向整形的指针元素组成,因为我在一本书上看见过,指针是可以相减的,那么c=p,这样子的是可以把指针内的值给c的,那么p-p也是可以的。。

奔跑的鸭蛋 发表于 2014-3-8 11:18:51

machimilk 发表于 2014-3-7 22:08 static/image/common/back.gif
改成这样就好了

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


这样子我也知道。就是要做数组指针做才出了问题。

奔跑的鸭蛋 发表于 2014-3-8 11:21:48

zhongguoren 发表于 2014-3-7 21:49 static/image/common/back.gif
如此神奇的程序,1.2.3.4.5.6做指针,不理解。。。
你把俩指针加加减减,这。。。。

你好,这样是1,2,3,4,5,6做了指针吗?我看到的书上是说,int *p不是定义了指针数组?

Simanzen 发表于 2014-3-8 11:52:31

本帖最后由 Simanzen 于 2014-3-8 11:54 编辑

*p是数组指针,其元素均为指向int数据类型的指针,你这样子定义int *p【6】={1,2,3,4,5,6,}相当于把const int 赋值给int *(即把常数赋值给指针),这是错误的,有些书是不可信的、错误的,lz要善于辨别

奔跑的鸭蛋 发表于 2014-3-8 13:24:45

Simanzen 发表于 2014-3-8 11:52 static/image/common/back.gif
*p是数组指针,其元素均为指向int数据类型的指针,你这样子定义int *p【6】={1,2,3,4,5,6,}相当于把cons ...

先谢谢你,那如果*p是数组指针,那(*p)呢,是不是说*p是指向p,p----p的6个指针,(*p)是指向整个数组的一个指针呢?。。

machimilk 发表于 2014-3-8 13:44:54

奔跑的鸭蛋 发表于 2014-3-8 11:18 static/image/common/back.gif
这样子我也知道。就是要做数组指针做才出了问题。

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

你那种写法我vs2008根本没法编译

奔跑的鸭蛋 发表于 2014-3-8 15:03:41

machimilk 发表于 2014-3-8 13:44 static/image/common/back.gif
非要用指针,这么写也行               
int p={1,2,3,4,5,6};
int *m=p;


我第一个程序是这样编的,我现在这个程序我把d=p-p换成d=&p-&p就可以了。还是很感谢你的帮助。{:1_1:}

Simanzen 发表于 2014-3-8 23:37:37

奔跑的鸭蛋 发表于 2014-3-8 13:24 static/image/common/back.gif
先谢谢你,那如果*p是数组指针,那(*p)呢,是不是说*p是指向p,p----p的6个指针,(*p) ...

int (*p)是指向一维数组的指针,其元素是int型,“*p是指向p,p----p的6个指针,”这个说法不对

未闻丶花名 发表于 2014-3-8 23:41:57

路过看看= =!

zhongguoren 发表于 2014-3-9 11:21:44

奔跑的鸭蛋 发表于 2014-3-8 11:21 static/image/common/back.gif
你好,这样是1,2,3,4,5,6做了指针吗?我看到的书上是说,int *p不是定义了指针数组?

是啊。但是你给指针数组赋值为1,2,3是做什么。。。

wqlovt 发表于 2014-11-28 10:32:57

这其实是一个很好的题目。不要认为他是错的。这里面涉及到很多隐藏的类型转换。
就拿这道题目来看

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

结论: 这种指针相加减的时候要考虑到他的类型 就相当于一个基 long*+1 说明是4个字节的跨度
页: [1]
查看完整版本: 指针问题求助————望各位大大不吝赐教—————————————————————