| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1119 人关注过本帖
标题:指针数组
只看楼主 加入收藏
o天道酬勤o
Rank: 1
等 级:新手上路
帖 子:106
专家分:0
注 册:2016-11-4
结帖率:94.44%
收藏
已结贴  问题点数:10 回复次数:6 
指针数组
程序代码:
#include<stdio.h>
#include<string.h> 
int main()
{
    void sort(char *name[],int n);
    void print(char *name[],int n);
    char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
    int n=5;
    sort(name,n);
    print(name,n);
    return 0;
}
void sort(char *name[],int n)
{
    char *temp;
    int i,j,k;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        if(strcmp(name[k],name[j])>0)k=j;
        if(k!=i)
        {
            temp=name[i];name[i]=name[k];name[k]=temp;
        }
    }
}
void print(char *name[],int n)
{
    int i;
    for(i=0;i<n;i++)
    printf("%s\n",name[i]);
}
/*将print改写成下面这样,运行结果为什么不正确?
void print(char *name[],int n)
{
    int i;
    char *p;
    p=*name;
    for(i=0;i<n;i++)
    printf("%s\n",p++);
}*/
2017-02-24 16:28
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:10 
我想,解决这些错误,最好的办法是要清楚你引用的什么类型,例如这里引用的name,属于指向指针的指针,所以使用引用也以解指针的指针来考量,那样就比较安全一些。

程序代码:
#include<stdio.h>
#include<string.h> 
int main()
{
    void sort(char *name[],int n);
    void print(char *name[],int n);
    char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
    int n=5;
    sort(name,n);
    print(name,n);
    return 0;
}
void sort(char *name[],int n)
{
    char *temp;
    int i,j,k;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        if(strcmp(name[k],name[j])>0)k=j;
        if(k!=i)
        {
            temp=name[i];name[i]=name[k];name[k]=temp;
        }
    }
}
void print(char *name[],int n)
{
    int i;
    char *p;
    for(i=0;i<n;i++){
        printf("  name : %s\n",name[i]);
        p= *name;
        printf("the p1 : %s\n",p+i);
        p = name[0];    //这里把头地址给p
        printf("the p2 : %s\n",p+i);    //让后让p自己增加位置,但步长为1。
        p = name[i];    //这里把个元素的值给p
        printf("the p3 : %s\n",p+1);    //输出了字符串,不过+1给前移了一个字符
        
        printf("\n");
    }
    
    //于是乎,发现p上,p为字符类型指针,步长为1,而name是指针的指针。
    
    char **q;  //于是,我来个指针的指针
    q = name;    //取得name的地址
    for (i = 0 ; i < n ; i++){
        printf("the q = %d : %s\n",i,*q++);  //那q就是指针的指针了,输出一个字符串数组用*q
    }    
}


[此贴子已经被作者于2017-2-24 17:13编辑过]

2017-02-24 16:43
o天道酬勤o
Rank: 1
等 级:新手上路
帖 子:106
专家分:0
注 册:2016-11-4
收藏
得分:0 
回复 2楼 kin3z
未被注释掉的部分使用name[i]运行结果是正确的。
2017-02-24 16:46
o天道酬勤o
Rank: 1
等 级:新手上路
帖 子:106
专家分:0
注 册:2016-11-4
收藏
得分:0 
回复 2楼 kin3z
好的
2017-02-24 16:46
o天道酬勤o
Rank: 1
等 级:新手上路
帖 子:106
专家分:0
注 册:2016-11-4
收藏
得分:0 
程序代码:
void print(char *name[],int n)
{
    int i;
    char **p;
    p=name;
    for(i=0;i<n;i++)
    printf("%s\n",*p++);
}

这样就可以了。。。
可那样为什么不对??
2017-02-24 17:12
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 3楼 o天道酬勤o
name[i] ; 那个name[i] 元素记录的就是目标字符串的首地址,所以printf输出刚好也直接需要那个字符串数组的首地址,所以能找到目标字符串正常输出。
而p不是,p是一个字符类型的指针,就算用来记录一个字符串的首地址,它也只能记录1个字符串的首地址值。但name是好几个首地址的数组。
所以声明*p只记录1个字符串(首地址),而**p则声明为记录好几个字符串(首地址),不知这样解析可否恰当与明了。
2017-02-24 17:19
o天道酬勤o
Rank: 1
等 级:新手上路
帖 子:106
专家分:0
注 册:2016-11-4
收藏
得分:0 
回复 6楼 kin3z
明白了,非常感谢
2017-02-24 17:38
快速回复:指针数组
数据加载中...
 
   



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

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