鱼C论坛

 找回密码
 立即注册
查看: 2889|回复: 10

求高人指点 ~~~指针数组问题

[复制链接]
发表于 2012-2-3 11:05:37 | 显示全部楼层 |阅读模式

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

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

x

  1. 觉得舒服
复制代码


#include<stdio.h>
#include<string.h>
void main ()
{
      void sort ( char *name =[ ], int n );
      void print( char *name =[ ], int n );
      char *name[ ] = {"neame","sffeasa","efewf","efsaef","sdf" };
      int n = 5;
     sort(name ,  n );
    print( name , n );
}
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;   /*name[ i ]指的是指针(地址),在这里指的是地址的比较吗?是不是
          if ( k!=i )                                               /*是不是加了strcmp 以后将name[ 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++ )
      print("%s",name[i])
}

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-3 11:21:45 | 显示全部楼层
也许是我没学好,没看懂楼主的意思,你说的既然是一个指针数组,那么name实质上就是一个数组,只是这个数据只能够存放的内容是内存的单元地址编号,char *name[ ] = {"neame","sffeasa","efewf","efsaef","sdf" };
这句是什么意思,反正我是看不懂...:(
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-3 11:42:44 | 显示全部楼层

指针数组 name[ i ] 指向第i个字符串的首地址  {   }里面的是定义了 5个 不同的 字符串
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-3 11:52:19 | 显示全部楼层
貌似你的代码编译器不同过
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-3 14:23:31 | 显示全部楼层
本帖最后由 Tazy_ong 于 2012-2-3 21:56 编辑

地址是不可以交换的,你确定这个程序能正常运行?
根据这个程序的思路,我还原了一下这个程序,希望对你有帮助!
  1. #include<stdio.h>
  2. #include<string.h>

  3. /* ----- 函数声明 -----*/
  4. void sort(char *[], int);
  5. void print(char *[], int);

  6. /* ----- 主函数 ----- */
  7. int main (void)
  8. {
  9.         int len = 5;        // 数组长度
  10.         char *name[] = {"neame","sffeasa","efewf","efsaef","sdf" };

  11.         sort(name, len);
  12.         print(name, len);

  13.         return 0;
  14. }

  15. /* ----- 冒泡排序 ----- */
  16. void sort(char *name[], int len)
  17. {
  18.         int i, j;
  19.         char *temp;

  20.         for (i=0; i<len-1; i++)
  21.         {
  22.                 for (j=0; j<len-i-1; j++)
  23.                 {
  24.                         /* 函数 strcmp(const char *, const char *)
  25.                            功能是传入两个字符或字符串的地址,比较这两个字符或字符串的ASCII码大小,并返回一个整型值。
  26.                            例如 : 如果 s1=s2, 则 strcmp(&s1, &s2) == 0
  27.                                    如果 s1>s2, 则 strcmp(&s1, &s2) > 0
  28.                                    如果 s1<s2, 则 strcmp(&s1, &s2) < 0
  29.                         */
  30.                         if ( 0 < (strcmp(name[j], name[j+1])) )
  31.                         {
  32.                                 // 交换数组元素存储的地址
  33.                                 temp = name[j];
  34.                                 name[j] = name[j+1];
  35.                                 name[j+1] = temp;
  36.                         }
  37.                 }
  38.         }
  39. }

  40. /* ----- 输出 ----- */
  41. void print(char *name[], int len)
  42. {
  43.         int i;

  44.         for (i=0; i<len; i++)
  45.         {
  46.                 printf("%s\n", name[i]);
  47.         }
  48. }

  49. /*
  50. 在 VC++ 6.0 中的输出结果是:
  51. ----------------------------
  52. efewf
  53. efsaef
  54. neame
  55. sdf
  56. sffeasa
  57. ----------------------------
  58. 注意: 排序是按照ASCII码大小排序的,不是按照字符串长度排序的。
  59. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-3 20:13:45 | 显示全部楼层
地址可以交换,你的程序修改如下:
  1. #include<stdio.h>
  2. #include<string.h>
  3. void main ()
  4. {
  5.         void sort ( char *name[ ], int n );
  6.         void print( char *name[ ], int n );
  7.         char *name[ ] = {"neame","sffeasa","efewf","efsaef","sdf" };
  8.         int n = 5;
  9.         sort(name ,  n );
  10.     print( name , n );
  11. }
  12. void sort( char *name[ ], int n )
  13. {
  14.         char *temp;
  15.         int i, j, k;
  16.         for ( i = 0; i < n-1; i++ )
  17.         {
  18.                 k = i;
  19.                 for ( j = i+1; j < n; j++ )
  20.                         if ( strcmp(name[k],name[j] )>0 ) k = j;   //name[ i ]指的是指针(地址),在这里指的是地址的比较吗?是不是
  21.                 if ( k!=i )                                               //是不是加了strcmp 以后将name[ i ]的地址转换为指针所字符串吗?
  22.                 {
  23.                         //temp = name;
  24.                         temp = name[i];
  25.                         //name = name[k];
  26.                         name[i]=name[k];
  27.                         name[k] = temp;    //  这个是地址地交换吗?
  28.                 }
  29.                        
  30.         }  
  31. }
  32. void print(char*name[], int n )
  33. {
  34.         int i;
  35.         for  ( i = 0; i < n; i++ )
  36.                 //print("%s",name);
  37.                 printf("%s\n",name[i]);
  38. }


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-3 21:43:14 | 显示全部楼层
本帖最后由 Tazy_ong 于 2012-2-3 22:00 编辑
仰望天上的光 发表于 2012-2-3 20:13
地址可以交换,你的程序修改如下:

可能我理解错了,我说的地址是指一个数据在内存中存储的地址,这个地址是不可以更改,而指针变量里存储的地址是可以交换的。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-3 22:27:39 | 显示全部楼层
  temp = name;
              name = name[k];
            name[k] = temp;    /*  这个是地址地交换吗?

name和name[k]类型不同
char*[]存放char*的数组
name[k]就是char*
没啥难理解的吧
char *就是指向字符串的首地址 怎么能不可以修改指向别的字符串首地址呢
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-4 23:59:22 | 显示全部楼层
支持六楼。。。,这个代码在csdn上也看到过,真怀疑你们看的是不是一本书来的。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-5 00:10:43 | 显示全部楼层
兄弟你的代码写的很不规范啊!请纠正代码规范!
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-5 10:26:53 | 显示全部楼层
好吧 知道了
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-11 02:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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