| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1206 人关注过本帖, 1 人收藏
标题:多级指针+整数n后等于什么?
只看楼主 加入收藏
huanghongfu
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2010-6-29
结帖率:0
收藏(1)
已结贴  问题点数:10 回复次数:10 
多级指针+整数n后等于什么?
main()
{
  char **p,*ps[5],str[5][10];  /*定义二级指针p,指针数组ps,字符数组str*/
  int i;
  for(i=0;i<5;i++)
  ps[i]=str[i];  /*数组str第i行的首地址赋予数组指针ps的各个数组元素*/
  p=ps;    /*指针数组的首地址&ps[0]赋予 二级指针p*/


问:p+i表示什么?
    *(p+i)表示什么?
 
个人感觉像 p+i 是 &ps[i] ,*(p+i) 是 ps[i] 同时也是 &str[i] 如果你知道,请指教
(刚来,分没多少,请见谅啊)
搜索更多相关主题的帖子: 整数 指针 
2010-07-05 12:00
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:3 
p+i就是一个野指针了 *(p+i)就是一个访问野指针内容了  操作违例了
2010-07-05 12:13
huanghongfu
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2010-6-29
收藏
得分:0 
嗯,我想知道具体指向哪个变量。还有操作没违例,我的程序可以编译执行
2010-07-06 08:12
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:0 
编译能通过 但是已经操作越界了  
2010-07-06 08:32
DestinyLord
Rank: 2
等 级:论坛游民
帖 子:26
专家分:41
注 册:2010-6-1
收藏
得分:3 
举个简单例子看对你有没帮助吧:
如果int a[10]; int *p = &a[0]; 那么*(p+1)就是指向a[1].
如果int a[4][3]; int (*p)[3] = a; 那么p+1指向的是二维数组的第二行.

[ 本帖最后由 DestinyLord 于 2010-7-6 19:33 编辑 ]

逆风的方向,更适合飞翔!
2010-07-06 19:31
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:0 
5楼是正确的  我想错了  
2010-07-06 21:25
huanghongfu
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2010-6-29
收藏
得分:0 
回复 5楼 DestinyLord
举个简单例子看对你有没帮助吧:
如果int a[10]; int *p = &a[0]; 那么*(p+1)就是指向a[1].
如果int a[4][3]; int (*p)[3] = a; 那么p+1指向的是二维数组的第二行.

   int (*p)[3]定义了一个指向 含有3个元素的一维数组 的指针P,然后将二维数组a第0行第0列的地址赋予p,这种指针加法的单位是数组元素的长度(即加1等于跳过三个元素,也就是跳向下一行)与我在问题中提到的指针数组不一样。
   还有数组名加整数n等于第n+1个数组元素的地址,虽然是书上写的但对于这点我有些疑问:
    存储器单元和存储单元地址:存储器是由大量寄存器组成的,其中每一个寄存器就称为一个存储单元。它可存放一个有独立意义的二进制代码。一个代码由若干位(bit)组成,代码的位数称为位长,习惯上也称为字长。存储单元一般应具有存储数据和读写数据的功能,一般以8位二进制作为一个存储单元,也就是一个字节。在计算机中的存储器往往有成千上万个存储单元,为了使存入和取出不发生混淆,必须给每个存储单元一个唯一的固定编号,这个编号就称为存储单元的地址。 (由此可见每个存储单元能存储一个字节,也就是说一个字节对应于一个地址。数组名a代表第1个元素的地址假设为0000,加n是不是往后推n个存储单元其地址为000n。这在数组的数据类型为char(1字节)的时候没问题指向第n+1个元素。当数组类型为int(2字节)、float(4字节)时就不是指向第n+1个元素了,而是指向第n/2、n/4个元素。)
以上是我的想法,用Turbo c++验证了是错误的。只不过想知道错在哪
2010-07-07 09:27
huanghongfu
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2010-6-29
收藏
得分:0 
验证程序
程序代码:
#include<stdio.h>
void main()
{
  char *p,v[5]={"abcde"};
  float *s,a[5]={1.2,2.3,3.1,4.1,5.3};
  int i,j;
  s=a;
  p=v;
  printf("\n");
  printf("an char is %d bytes\n",sizeof(char));
  printf("an int is %d bytes\n",sizeof(int));
  printf("an float is %d bytes\n",sizeof(float));
  for(i=0;i<5;i++)
  printf("%c",*(p+i));
  printf("\n");
  for(j=0;j<5;j++)
  printf("%f",*(s+j));
  getch();
}

2010-07-07 09:28
DestinyLord
Rank: 2
等 级:论坛游民
帖 子:26
专家分:41
注 册:2010-6-1
收藏
得分:0 
回复 7楼 huanghongfu
我想问一下,你说那个错了是验证错了还是你想法错了??

逆风的方向,更适合飞翔!
2010-07-11 00:01
DestinyLord
Rank: 2
等 级:论坛游民
帖 子:26
专家分:41
注 册:2010-6-1
收藏
得分:0 
以下是引用huanghongfu在2010-7-7 09:27:21的发言:

举个简单例子看对你有没帮助吧:
如果int a[10]; int *p = &a[0]; 那么*(p+1)就是指向a[1].
如果int a[4][3]; int (*p)[3] = a; 那么p+1指向的是二维数组的第二行.

   int (*p)[3]定义了一个指向 含有3个元素的一维数组 的指针P,然后将二维数组a第0行第0列的地址赋予p,这种指针加法的单位是数组元素的长度(即加1等于跳过三个元素,也就是跳向下一行)与我在问题中提到的指针数组不一样。
   还有数组名加整数n等于第n+1个数组元素的地址,虽然是书上写的但对于这点我有些疑问:
    存储器单元和存储单元地址:存储器是由大量寄存器组成的,其中每一个寄存器就称为一个存储单元。它可存放一个有独立意义的二进制代码。一个代码由若干位(bit)组成,代码的位数称为位长,习惯上也称为字长。存储单元一般应具有存储数据和读写数据的功能,一般以8位二进制作为一个存储单元,也就是一个字节。在计算机中的存储器往往有成千上万个存储单元,为了使存入和取出不发生混淆,必须给每个存储单元一个唯一的固定编号,这个编号就称为存储单元的地址。 (由此可见每个存储单元能存储一个字节,也就是说一个字节对应于一个地址。数组名a代表第1个元素的地址假设为0000,加n是不是往后推n个存储单元其地址为000n。这在数组的数据类型为char(1字节)的时候没问题指向第n+1个元素。当数组类型为int(2字节)、float(4字节)时就不是指向第n+1个元素了,而是指向第n/2、n/4个元素。)
以上是我的想法,用Turbo c++验证了是错误的。只不过想知道错在哪
随便说一下,你那想法好像有点奇怪,因为你用char时n是1,但是你用int和float时那个也会相应变化吧,因为你是地址,int型分配的内存空间是一个整体,这里是整体+1,不是地址编号加1。还有,编译器不同的话数组类型占用字节也是不一样的。
这是我的理解,不知道对不对~可以讨论讨论

[ 本帖最后由 DestinyLord 于 2010-7-11 00:08 编辑 ]

逆风的方向,更适合飞翔!
2010-07-11 00:07
快速回复:多级指针+整数n后等于什么?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047547 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved