当前位置: 代码迷 >> C语言 >> [求助]简单又困惑的问题?
  详细解决方案

[求助]简单又困惑的问题?

热度:230   发布时间:2006-08-14 18:16:56.0
[求助]简单又困惑的问题?

一个指针数组char *p[3] 分别指向多字符串char str[3][20]
现在的问题是:
*p[1]是否等于*(p+1)

搜索更多相关的解决方案: 困惑  

----------------解决方案--------------------------------------------------------
p[1]是指针数组的第一个指针,它指向的是第一个字符串的首址
所以*p[1]是第一个字符串的第一个字符
*(p+1)=同
----------------解决方案--------------------------------------------------------
我也这么想
你看
#include"stdio.h"
#include"string.h"
main()
{
char *a[3],cc[3][20];
int i;
char *p;
for(i=0;i<3;i++)
a[i]=cc[i];
for(i=0;i<3;i++)
scanf("%s",a[i]);
if(strcmp(*a,*(a+1))>0)
{p=*a;*a=*(a+1);*(a+1)=p;}
if(strcmp(*a,*(a+2))>0)
{p=*a;*a=*(a+2);*(a+2)=p;}
if(strcmp(*a,*(a+2))>0)
{p=*(a+1);*(a+1)=*(a+2);*(a+2)=p;}
for(i=0;i<3;i++)
printf("%s\n",a[i]);}


我把*(a+i)全代为*a[i]后有好几个warning
虽然能complie,但是不能运行
我不明白为什么会这样


----------------解决方案--------------------------------------------------------
我在VC下编译运行的,没有问题
----------------解决方案--------------------------------------------------------
以下是引用wolf_elite在2006-8-14 18:43:33的发言:
我也这么想
你看
#include"stdio.h"
#include"string.h"
main()
{
char *a[3],cc[3][20];
int i;
char *p;
for(i=0;i<3;i++)
a[i]=cc[i];
for(i=0;i<3;i++)
scanf("%s",a[i]);
if(strcmp(*a,*(a+1))>0)
{p=*a;*a=*(a+1);*(a+1)=p;}
if(strcmp(*a,*(a+2))>0)
{p=*a;*a=*(a+2);*(a+2)=p;}
if(strcmp(*a,*(a+2))>0)//*a应该改为*(a+1) 吧
{p=*(a+1);*(a+1)=*(a+2);*(a+2)=p;}
for(i=0;i<3;i++)
printf("%s\n",a[i]);}


我把*(a+i)全代为*a[i]后有好几个warning
虽然能complie,但是不能运行
我不明白为什么会这样


----------------解决方案--------------------------------------------------------
不等,完全不同,差了一级。
P[1]可以理解为:*(P+1);
跟*P[1]刚好差了一级指针。

----------------解决方案--------------------------------------------------------

[QUOTE]*p[1]是否等于*(p+1)[/QUOTE]

不同,它们的地址不同。

p[1]表示数组P中第2个元素。p[1]的值为指向的地址值,因为是指针数组,它指向的是str[1]的地址,故p[1]==str[1];

例:设p的地址在机器中为0x12345,则p[1]可为指向任何char变量或char数组的地址值,因为p[1]表示的是数组中的元素。

(p+1)则表示以数组P的地址为基地址向后漂移1一个字节。

例:设p的地址在机器中为0x12345,则(p+1)为0x12346


----------------解决方案--------------------------------------------------------
引用
(p+1)则表示以数组P的地址为基地址向后漂移1一个字节。
楼上自己试一下这个
int a[3];
int *p=a;
printf("%x,%x",a,p+1);

----------------解决方案--------------------------------------------------------
大意了,对不起,楼主
----------------解决方案--------------------------------------------------------
以下是引用soft_wind在2006-8-14 19:40:15的发言:
引用
(p+1)则表示以数组P的地址为基地址向后漂移1一个字节。
楼上自己试一下这个
int a[3];
int *p=a;
printf("%x,%x",a,p+1);

.我不认为是向后漂移一个字节,而是增加它指向的对象长度


----------------解决方案--------------------------------------------------------
  相关解决方案