| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1161 人关注过本帖
标题:指针指到我不行了
只看楼主 加入收藏
长肉的骷髅
Rank: 1
等 级:新手上路
帖 子:22
专家分:4
注 册:2010-7-22
结帖率:0
收藏
已结贴  问题点数:20 回复次数:13 
指针指到我不行了
用指针数组给一些字符串排序 哪里出问题了啊
# include <stdio.h>
# include <string.h>

void main()
{int i;
char *str[10]={"china","japan","yemem","pakistan","mexico","korea","brazil","iceland","canda","mongolia"};
char **p,**pt;char *t;
for(p=str;**p!='\0';p++)
for(pt=p+1;**pt!='\0';pt++)
if(strcmp(*p,*pt)>0)
{t=*p;*p=*pt;*pt=t;}

for(i=0;i<10;i++)
{p=str+i;
printf("%s\n",*p);}
}
昨天也是一个关于指针数组的问题 得到高手指教才顿悟 现在再次发帖 还是指针 这指针太让人揪心了
搜索更多相关主题的帖子: 指针 
2010-07-23 10:25
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:3 
我说废话 说腻了 希望这翻解析 你得到点什么
# include <stdio.h>
# include <string.h>

void main()
{int i;
char *str[10]={"china","japan","yemem","pakistan","mexico","korea","brazil","iceland","canda","mongolia"};
char **p,**pt;char *t;
for(p=str;**p!='\0';p++) //p的内容是str的地址,*p的内容是str的首地址,**p的内容是str的首地址里的内容,p++的内容是str的地址加上sizeof(char)*10;
for(pt=p+1;**pt!='\0';pt++)//pt的内容是str的地址加1,也就是str的地址加上sizeof(char)*10,后面的同上
if(strcmp(*p,*pt)>0)//*p的内容是*指向p的内容的内容,p的内容是str的地址,p的内容的内容是指针数组的首地址,后面如解
{t=*p;*p=*pt;*pt=t;}//t的类型是 char *,而*p的类型也是 char *,所以可以进行赋值,从而达到交换

for(i=0;i<10;i++)
{p=str+i;        //p的内容是str的地址加上sizeof(char)*10*i
printf("%s\n",*p);}//*p的内容是 指向str的地址加上sizeof(char)*10*i这个地址里的内容(指针数组的地址)
}
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 do8do8do8 于 2010-7-23 11:36 编辑 ]

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-23 11:30
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:3 
# include <stdio.h>
# include <string.h>

int main()
{
    int i,j,k;
    char *str[10]={"china","japan","yemem","pakistan","mexico","korea","brazil","iceland","canda","mongolia"};
    char *t = NULL;

    for (i = 0 ; i < 9 ; i++)
    {
        k = i;
        for(j = i+1 ; j < 10 ; j++)
            if(strcmp(str[i],str[j]) > 0)
                k = j;
        t = str[i];
        str[i] = str[k];
        str[k] = t;

    }


    for(i =0 ; i <10 ; i++)
        printf("%s\n",str[i]);

    return 0;
}
给了一个修改之后的程序。
2#说的很清楚了,str是数组的地址,p指向数组的地址,p++表示增加了整个数组的长度(sizeof(char*)*10),已经越界了。
2010-07-23 12:11
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
回复 2楼 do8do8do8
突然想到这么一个情况,一个数组:int a[10],那么a是数组首元素的首地址,也就是a[0]的地址,a+1代表a[1]的地址。
而&a才是数组的地址,&a+1代表下一个数组的地址。
那么现在的指针数组*str[10],不是应该是&str是指针数组的首地址了吗,&str+1才会是下一个指针数组的首地址
str应该是指针数组首元素的首地址啊,str+1是第二个指针元素str[1]没错啊!
而编译器好像是按照你所说的这么认为的,也就是把str当成指针数组的首地址,
请问这是为什么呢,是因为指针数组和其他的数组的情况不一样吗!

ps:楼主不好意思了,在你的帖子下发问。只是觉得在你这个问题的基础之上提出我的这个疑问会更加清楚一些,不要介意哦~
2010-07-23 12:44
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
回复 4楼 erikyo
str=&str=&str[0] 二指针数组中指针变量的内容是 str 他们都是指向同一个位置

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-23 13:52
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
回复 5楼 do8do8do8
str=&str=&str[0]是没错,但是对编译器来说他们的意义是不一样的。str是指针数组首元素的首地址,
&str[0]也是指针数组首元素的首地址,str和&str[0]的值一样,他们代表的意思也一样。
但是&str就不一样了,他指的是整个指针数组的首地址。
当str+1之后与&str+1的值就不一样了

还有做了一下测试,发现做
p = str;
p++;
p的值并不是增加sizeof(char)*10,而是增加了sizeof(char*)的值,也就是4。
2010-07-23 15:35
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
回复 6楼 erikyo
you got it! congratulation!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-23 16:05
rjgongzuo201
Rank: 1
等 级:新手上路
帖 子:3
专家分:3
注 册:2010-7-23
收藏
得分:3 
p的值并不是增加sizeof(char)*10,而是增加了sizeof(char*)的值,也就是4。
2010-07-23 16:53
rjgongzuo201
Rank: 1
等 级:新手上路
帖 子:3
专家分:3
注 册:2010-7-23
收藏
得分:0 
# include <stdio.h>
# include <string.h>

void main()
{int i;
char *str[10]={"china","japan","yemem","pakistan","mexico","korea","brazil","iceland","canda","mongolia"};
char **p,**pt;
char *t;

for(p=str;p<(str+10);p++)
for(pt=p+1;pt<(str+10);pt++)
if(strcmp(*p,*pt)>0)
{
    t=*p;
    *p=*pt;
    *pt=t;
}

for(i=0;i<10;i++)
{
    p=str+i;
    printf("%s\n",*p);
}

}
2010-07-23 16:54
长肉的骷髅
Rank: 1
等 级:新手上路
帖 子:22
专家分:4
注 册:2010-7-22
收藏
得分:0 
懂了懂了 **p!='\0',这个条件一直得不到满足,但p++却一直在执行 然后出界了 十分感谢各位高手 尤其2楼的朋友 很详细
2010-07-23 20:10
快速回复:指针指到我不行了
数据加载中...
 
   



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

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