至今对C的语法苦恼中!

OpenOffice_org 2005-04-22 11:22:15
#include<stdio.h>


void main()

{
int a[10];
int i,*p=a;

for(i=0;i<10;i++)
scanf("%d",p++);

for(i=0;i<10;i++)
printf("%d\n",*p--);

}
如果我把a[10]={1,2,3,4,5,6,7,8,9,10};
则输出为:
1245120 //这里为什么会是这个结果?
10
9
8
7
6
5
4
3
2

另:
如果我把最后一句改为:printf("%d\n",--*p);
结果为:
1245119
1245118
1245117
1245116
1245115
1245114
1245113
1245112
1245111
1245110 这是什么东东?


如果说是地址,可如果改为printf("%d\n",--p);
结果又会是这样:
1245052
1245048
1245044
1245040
1245036
1245032
1245028
1245024
1245020
1245016 //这和上面的都是指什么?这是地址?


我实在晕了呀,希望高手帮帮我!

请指教,谢谢!


...全文
151 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
OpenOffice_org 2005-04-23
  • 打赏
  • 举报
回复
谢谢两位了,以后有问题再请教,分不多555
Death_YEH 2005-04-23
  • 打赏
  • 举报
回复
刚才的确有个错误
说声对不起
应该是 int (*p)[3];
关于二维数组偏移量的问题
int a[10][10];
int *p;
p = a; //我觉得这句语法有错

如果用
int (*p)[10];

int **p;
就可以很清楚的看出偏移量了
shazi_pig 2005-04-23
  • 打赏
  • 举报
回复
这是--和*p的优先级的问题,先是*p,然后对*p进行——操作。
你把它该为*(--p)结果也是正确的。

1245119 就算是先*p,再--,也应该是数组的数值自减操作呀,怎么会变成这种内容?
1245118
1245117
1245116
1245115
1245114
1245113
1245112
1245111
1245110
----------------------:
你(f9)跟一下就可以看到:a[10]的内容是:1245120,那么它的值——操作,就是上面的结果。
shazi_pig 2005-04-23
  • 打赏
  • 举报
回复
那么:p+1到底是行方向偏移还是列方向偏移呢?:
#include<stdio.h>


void main()

{
int a[3][3]={1,2,3,4,5,6,7,8,9};

int *p;
p=&a[0][0];

while(*p<10)
{
printf("%d\n",*(p++));
}

}
结果是:1
2
3
4
5
6
7
8
9
那么答案也就出来了。
OpenOffice_org 2005-04-23
  • 打赏
  • 举报
回复
这是--和*p的优先级的问题,先是*p,然后对*p进行——操作。
你把它该为*(--p)结果也是正确的。

1245119 就算是先*p,再--,也应该是数组的数值自减操作呀,怎么会变成这种内容?
1245118
1245117
1245116
1245115
1245114
1245113
1245112
1245111
1245110
OpenOffice_org 2005-04-23
  • 打赏
  • 举报
回复
二维数组要用*p[]或**p
比如:
int a[3][3];
int **p; 这种搞法书上没有呀?越来越晕了。
p = a;
或是:
int a[3][3];
int *p[3]; 你这不成指针数组了吗? 应该是:(*p)[3] 吧?
p = a;


总之,谢谢你们两位了,还请多指教!。


shazi_pig 2005-04-23
  • 打赏
  • 举报
回复
如果我把最后一句改为:printf("%d\n",--*p);
---------------------------------------------:
这是--和*p的优先级的问题,先是*p,然后对*p进行——操作。
你把它该为*(--p)结果也是正确的。
#include<stdio.h>


void main()

{
int a[10];
int i,*p=a;

for(i=0;i<10;i++)
scanf("%d",p++);

for(i=0;i<10;i++)
printf("%d\n",*(--p));


}
上面也是个正确的程序。
OpenOffice_org 2005-04-23
  • 打赏
  • 举报
回复
我一直对二维数组的地址偏移方式不是很理解,

据我自己的理解,

如;int a[10][10];
int *p;
假设p指向a;
那么:p+1到底是行方向偏移还是列方向偏移呢?


Death_YEH 2005-04-23
  • 打赏
  • 举报
回复
二维数组要用*p[]或**p
比如:
int a[3][3];
int **p;
p = a;
或是:
int a[3][3];
int *p[3];
p = a;
shazi_pig 2005-04-23
  • 打赏
  • 举报
回复
void main()

{
int a[3][3]={1,2,3,4,5,6,7,8,9};

int *p,*q;
p=a;//这样是不可以的,编译器要报错的。

printf("%d\n",a);
printf("%d\n",p+1);//p+1是地址是不可以的。%d是整型,他和p+1的类型不匹配是不可以的。

}

二维数组的指针不能这样赋吗? p=a; ???
--------------------------------------------------------------:
#include<stdio.h>


void main()

{
int a[3][3]={1,2,3,4,5,6,7,8,9};

int *p,*q;
p=&a[0][0];

printf("%d\n",a[0][0]);
printf("%d\n",*(p+1));

}
OpenOffice_org 2005-04-23
  • 打赏
  • 举报
回复
谢谢,你是说我的指针经过p++已经移到了数组a最后一个下标+1的位置是吗?

那么--*p和--p产生的结果是什么意思呢?

shazi_pig 2005-04-23
  • 打赏
  • 举报
回复
上面的程序我已经验正,是可以运行的
输出的结果是:
10
9
8
7
6
5
4
3
2
1
shazi_pig 2005-04-23
  • 打赏
  • 举报
回复
#include<stdio.h>


void main()

{
int a[10];
int i;
int* p=a;

for(i=0;i<10;i++)
{ scanf("%d",p++);


}
p--; //添上这句话就可以了。你的指针因为上面的p++已经跑到了下一个地址。
for(i=0;i<10;i++)
printf("%d\n",*(p--));
}
oooooa1 2005-04-23
  • 打赏
  • 举报
回复
我刚上机调试了一下..
我用的是WIN-TC
我日..
怎么结果是
-36
10
9
8
7
6
5
4
3
2
晕了...等高人来..
「已注销」 2005-04-23
  • 打赏
  • 举报
回复
#include<stdio.h>


void main()

{
int a[10];
int i,*p=a;

for(i=0;i<10;i++)
scanf("%d",p++);

for(i=0;i<10;i++)
printf("%d\n",*(--p));//这就对了

}
「已注销」 2005-04-22
  • 打赏
  • 举报
回复
p=&a[0][0];
OpenOffice_org 2005-04-22
  • 打赏
  • 举报
回复
#include<stdio.h>


void main()

{
int a[3][3]={1,2,3,4,5,6,7,8,9};

int *p,*q;
p=a;

printf("%d\n",a);
printf("%d\n",p+1);

}

二维数组的指针不能这样赋吗? p=a; ???
OpenOffice_org 2005-04-22
  • 打赏
  • 举报
回复
什么意思呀?
yahle 2005-04-22
  • 打赏
  • 举报
回复
先给这个函数
scanf("%d",p++);
增加一个逗号,后面的问题应该就可以解决了
scanf("%d,",p++);

70,020

社区成员

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

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