鱼C论坛

 找回密码
 立即注册
查看: 1462|回复: 3

[已解决]请高人指点:指针数组使用函数未排序 ...

[复制链接]
发表于 2019-1-14 09:23:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*********************************************/
/* 指针数组排序                                                    */
/*********************************************/
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<string.h>


int main()
{

#if( 0 )
        可以注释.....
#endif
       
        char * a[] = {"Japan", "China","USA","Canada","Russia"};
        void sort(char *a[], int n);
        void print(char *a[], int n);
        void swap(char *,char *);
       
                       
        sort(a, 5);
        print(a, 5);

       
        return 0;
}

void sort(char *a[], int n)
{
       
        int i, j, k;
        char *p;
       
        k = n - 1;

       
       
       
        for( j = 0; j < k-1; j++ )
        {
                for( i = 0; i < k - j; i++ )
                {
                        if(  strcmp( a[i] , a[i + 1] ) > 0 )
                        {
                               
                                p    =  a[i];
                                a[i] =  a[i + 1]; //
                                a[i + 1] = p;
                                printf("swap %s,%s\n", a[i] , a[i + 1]);
                               
                                //swap( a[i] , a[i + 1] );    使用函数交换未改变地址
                        }
                }
        }

}


//void swap(char *x, char *y )   
//{
//        char *p;
//
//        p = x;
//        x = y;
//        y = p;
//        printf("swap %s,%s\n", x ,y );
//}

void print(char *a[], int n)
{
        int i;
        for( i = 0; i < n; i++ )
        {
                printf("%s\n", *(a + i));
        }
}
最佳答案
2019-1-14 11:26:46
本帖最后由 Croper 于 2019-1-14 11:28 编辑

这是因为c语言里形参的传递默认是【复制】了一份原来的变量
比如在你的函数里面
void swap(char *x, char *y ) 
,x和y只是在传递中复制了一份a[ i]和a[i+1],整个函数只是在操作这两个复制,并没有改变原变量;

如果在想要在函数里改变原来的值,需要传递该变量的地址,而不是该变量本身。
void swap(char **x, char **y )   
{
        char *p;

        p = *x;
        *x = *y;
        *y = p;
        printf("swap %s,%s\n", *x ,*y );
}

...
        swap( &a[i] , &a[i + 1] );  
... 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-14 09:26:29 | 显示全部楼层
使用函数 swap(char *x, char *y )     并未实现交换地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-14 09:33:10 | 显示全部楼层
交换地址是很危险的操作,一般都是交换存放的值,而不是改变指针指向的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-14 11:26:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-1-14 11:28 编辑

这是因为c语言里形参的传递默认是【复制】了一份原来的变量
比如在你的函数里面
void swap(char *x, char *y ) 
,x和y只是在传递中复制了一份a[ i]和a[i+1],整个函数只是在操作这两个复制,并没有改变原变量;

如果在想要在函数里改变原来的值,需要传递该变量的地址,而不是该变量本身。
void swap(char **x, char **y )   
{
        char *p;

        p = *x;
        *x = *y;
        *y = p;
        printf("swap %s,%s\n", *x ,*y );
}

...
        swap( &a[i] , &a[i + 1] );  
... 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 04:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表