鱼C论坛

 找回密码
 立即注册
查看: 3850|回复: 7

关于视频49的一个小问题

[复制链接]
发表于 2012-8-13 01:43:27 | 显示全部楼层 |阅读模式
1鱼币
#include <stdio.h>
void main ()
{
  int a[5]={1,2,3,4,5};
  int *p[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
  int j;
     j=p[4]-p[1];
  printf("%d    %d\n",j,*p[2]);
}
为毛P[4]-p[1]的值为3咧....

最佳答案

查看完整内容

两个变量相减, 首先,看变量是什么类型, p[4] == &a[4] ; p[1] = &a[1] ; 对吧 这是你赋值的, 那么 a[4] 是 int 类型的, &a[4] 就是 int * 类型的, 同样 &a[1] 也是int * 类型的, 类型一样, C标准规定,两个 指针类型相减等于 他们的差值除以他们指向的数据类型的长度。 int * 类型 指向的当然是 int 类型 , 那么结果就出来了, p[4] - p[1] =( &a[4] - &a[1] )/sizeof(4) 当然若你熟练 可以直接看出 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-8-13 01:43:28 | 显示全部楼层
两个变量相减,  首先,看变量是什么类型, p[4] == &a[4] ;  p[1] = &a[1] ;  对吧 这是你赋值的,
那么 a[4]  是 int 类型的,  &a[4] 就是 int * 类型的,   同样 &a[1] 也是int * 类型的,   类型一样,
C标准规定,两个  指针类型相减等于  他们的差值除以他们指向的数据类型的长度。

int * 类型 指向的当然是 int 类型 , 那么结果就出来了,  p[4] - p[1] =( &a[4] - &a[1] )/sizeof(4)   
当然若你熟练 可以直接看出来,因为 a[4] 跟 a[1] 在同一个数组,可以推算出来。  但是你若还想看的更仔细,那么就写个 printf("p[4] == %X p[1] == %X ", p[4] , p[]1);  分别打印出他们的值,然后 除以4,看是不是3,除以4是因为前面说了 你定义的是 int 类型。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-13 10:52:56 | 显示全部楼层
我找到了谭浩强那本书上讲这个地方的一段话:“两个指针变量可以相减:如果两个指针变量都指向同一个数组中的元素,则两个指针变量之差是两个指针之间的元素个数。”    也就是这里p[4]和p[1]之间有3个元素
(4-1),就减出3来了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-13 12:49:09 | 显示全部楼层
上面  哪里应该是  sizeof(int )  书写失误;;
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-13 13:23:00 | 显示全部楼层

讲解很详细 的确 p[4]和p[1]相差一个c(12)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-14 00:14:27 | 显示全部楼层
Tzdner_C 发表于 2012-8-13 01:43
两个变量相减,  首先,看变量是什么类型, p[4] == &a[4] ;  p[1] = &a[1] ;  对吧 这是你赋值的,
那么  ...

我把他们便成double的试了下发现 果然~~...那万一不在同一个组 要怎么计算  一定要先看出来地址么~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-8-14 12:24:41 | 显示全部楼层
这个跟数组有什么关系呢。。。。。。。。要明白单纯的指针相减,只是貌似数组而已,千万不要理解为跟数组有什么关系。

还有 指针的值是你自己赋的,为什么问我要不要去看地址。  你可以这样啊
int * p = (int *)12 ;  int * p0 = (int *)4 ;    p  - p0  == (12 - 4)/4 = 2  ;

怎么了?  一个指针非要把变量的地址赋值给它?   非要是数组?     想不想看地址,那是你自己的事。。

其实计算机4G内存空间本身就可以看成一个大数组。。。。  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-15 00:48:39 | 显示全部楼层
Tzdner_C 发表于 2012-8-14 12:24
这个跟数组有什么关系呢。。。。。。。。要明白单纯的指针相减,只是貌似数组而已,千万不要理解为跟数组有 ...

前面赋值的时候 是把数组的地址赋给指针了  然后要是不在同一个数组里面的加减  是要先知道 指针的值的吧...也就是我赋的那个 地址的值...然后同一个数组的话  因为是连续存储 所以 不需要知道地址也能计算出来的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 15:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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