指针问题求助————望各位大大不吝赐教—————————————————————
#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,问题出在了哪里————先谢谢来帮忙的大大们————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
*p是个2维数组 ,然后自己再考虑 其实你这么写在C++里面会严重报错的~~~。
不过在C里面勉强通过,肯定还是会告诉你类型不匹配之类的警告
int *p 其实就是如下:
for(int i=0;i<6;i++)
{
p = (int *)malloc(sizeof(int)*10);
}
你又给其赋值为{1,2,3,4,5,6}。 自己再想想看吧。 如此神奇的程序,1.2.3.4.5.6做指针,不理解。。。
你把俩指针加加减减,这。。。。 改成这样就好了
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-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也是可以的。。 machimilk 发表于 2014-3-7 22:08 static/image/common/back.gif
改成这样就好了
int p={1,2,3,4,5,6};
这样子我也知道。就是要做数组指针做才出了问题。 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:54 编辑
*p是数组指针,其元素均为指向int数据类型的指针,你这样子定义int *p【6】={1,2,3,4,5,6,}相当于把const int 赋值给int *(即把常数赋值给指针),这是错误的,有些书是不可信的、错误的,lz要善于辨别 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)是指向整个数组的一个指针呢?。。 奔跑的鸭蛋 发表于 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根本没法编译 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:} 奔跑的鸭蛋 发表于 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 11:21 static/image/common/back.gif
你好,这样是1,2,3,4,5,6做了指针吗?我看到的书上是说,int *p不是定义了指针数组?
是啊。但是你给指针数组赋值为1,2,3是做什么。。。 这其实是一个很好的题目。不要认为他是错的。这里面涉及到很多隐藏的类型转换。
就拿这道题目来看
#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]