指针的初级问题

simaping 2007-11-23 10:03:32
请问一下下面这个程序哪里错了?
#include "stdio.h"
main()
{
int a[2][3]={1,2,3,4,5,6};
int *p,i,j;
p=a;
scanf("%d%d",&i,&j);
printf("a[%d][%d]=%d",i,j,*(*(p+i)+j));
}


谢谢
...全文
309 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
gchww 2007-11-26
  • 打赏
  • 举报
回复
1.首先,要把a强制转换成int *类型。
2.*(*(p+i)+j)的表示方法不对,p的值为数组a的地址,
*(p+i)是可以的,但是它所表示并不是一个地址,而是一个实际的数字。
所以在*(p+i)的外层再加*号就是错误的。
这里请注意二维数组的内容的存放方式,
他是在以a为首址的连续的6个int地址存放的。
这里的a并不等价于一个指向指针的指针。
Evenque 2007-11-25
  • 打赏
  • 举报
回复
*(p+i)+j表示二维数组
chump345 2007-11-23
  • 打赏
  • 举报
回复
#include "stdio.h"
main()
{
int a[2][3]={1,2,3,4,5,6};
int *p,i,j;
p=a;
scanf("%d%d",&i,&j);
printf("a[%d][%d]=%d",i,j,*(p+i)+j); /*,*(p+i)+j二维应该这样表示~*/
getch();}
yang511yang 2007-11-23
  • 打赏
  • 举报
回复
#include <stdio.h>//1
int main()//2
{
int a[2][3]={1,2,3,4,5,6};
int i,j;
int (*p)[3];//3
p=a;
scanf("%d%d",&i,&j);
printf("a[%d][%d]=%d",i,j,*(*(p+i)+j));
return 0;
}
Treazy 2007-11-23
  • 打赏
  • 举报
回复
>>保持类型的一致性可能是一个好的习惯吧,我一般不太喜欢强制转换,除非必须那样做

这话我同意,但是很多情况下必须那么干!
simaping 2007-11-23
  • 打赏
  • 举报
回复
是22楼说的那样,原来那个输出和行列号不对应,改了之后可以了,谢谢
PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
楼主说的是你运行的结果没有达到他的要求而已,他在13楼改了一下就没问题了,估计他已经明白了
PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
至于强制转换的问题,我建议还是少用的好,毕竟在写大程序的时候可能会让你很头疼

保持类型的一致性可能是一个好的习惯吧,我一般不太喜欢强制转换,除非必须那样做
Treazy 2007-11-23
  • 打赏
  • 举报
回复
对于
p[i+j]);
换成
p[i*3+j]);

我写的只是针对特定程序的代码,可能移植性不怎么好
在行下标小于2的前提下,对i进行乘可以省略!
但是楼主的修改还是可以的

不过我的错误到底在哪呢?楼主?
PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
TO:17楼

这可能是我们的习惯问题吧,我一般只在%c前面加一个空格,其它的我都不加,估计你的习惯是所有的都加空格吧,那样也可以,不过我们两个的效果肯定是一样的,只不过我少打了几个空格,你加大了程序的可读性吧
PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
不太明白12楼的意思,能不能解释一下
Treazy 2007-11-23
  • 打赏
  • 举报
回复
to PcrazyC
本身程序对i,j的输入就没做判断
加入的话那我的问题自然也就解决了!
p本来声明的时候就是一个指针,它一定要和a的结构一样?

另外对于
scanf中不加空格的做法,我个人是比较反对的
虽然效果是一样的,但对于程序的可读性来说,少了很多“言外之意”

以上是我的个人看法
如果有不同意
欢迎说出自己的想法!

PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
13楼也是一个巧妙的做法,二维数组和一维数组下标转换的方法
PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
TO:Treazy

你在二楼作的强制转换已经破坏了数组的结构,这个时候的P相当于是一个一维数组了,有六个元素,分别储存那六个数,所以,你输入2 3和3,2都能输出最后一个元素,因为3+2==2+3;另外3,2和2,3在A[2][3]中是越界的,达不到楼主的要求
findheart 2007-11-23
  • 打赏
  • 举报
回复
建议:
1.stdio.h用尖括号包含
2.main函数加上返回值
3.main函数最后显式return
4.p=(int *)a;
5.输入i和j后检查范围是否有效

错误:
p的移动方法:*(p+(i-1)*3+j-1)
simaping 2007-11-23
  • 打赏
  • 举报
回复
main()
{
int a[2][3]={1,2,3,4,5,6};
int *p,i,j;
p= (int *)a; //强制转换
scanf("%d%d",&i,&j); //scanf对2个%d没必要非要分开,系统会将空格
回车和制表符自动视为分隔符
printf("a[%d][%d]=%d",i,j, p[i*3+j]); //应为p[i*3+j]),还要考率列数
}

谢谢两位,Pcrazy 用的是列指针,Treazy 用的是行指针,我明白一些了。
Treazy 2007-11-23
  • 打赏
  • 举报
回复
你在输入数字i,j的时候
需要在i后面加入空格再输入j,然后回车
PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
To:你就算加了空格,你输入23还是不能得到你要的结果,输入两个数肯定会要用空格分开是不,但scanf可以跳过空格,所以不用多加个空格
Treazy 2007-11-23
  • 打赏
  • 举报
回复
>>你的运行结果不对哦

真的吗?把运行情况说来听听!
Treazy 2007-11-23
  • 打赏
  • 举报
回复
to 楼主,想想我改的,再想想PcrazyC改的,是有区别的

to Pcrazy

scanf("%d%d",&i,&j); //那麻烦你输入个23给我输出个a[2][3]看看!放在一起怎么区分2个数?永远只会被当作1个不越界的数
加载更多回复(11)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧