鱼C论坛

 找回密码
 立即注册
查看: 4489|回复: 11

关于数组指针的问题

[复制链接]
发表于 2012-12-12 20:12:03 | 显示全部楼层 |阅读模式
20鱼币
  1. #include<stdio.h>
  2. #include<string.h>
  3. void sort(char (*p)[5]);
  4. void main()
  5. {
  6.         char a[4][5] = {"wosh","shi","chua","qi"};
  7.         sort(a);
  8. }
  9. void sort(char (*p)[5])
  10. {
  11.         int i, j, pos;
  12.         char *q;
  13.         for( i = 0; i < 3; i++ )
  14.         {
  15.                 pos = i;

  16.                 for( j = i+1; j < 4; j++)
  17.                         if( strcmp(*(p + pos),*(p + j)) > 0)
  18.                                 pos = j;

  19.                         if( i != pos)
  20.                         {
  21.                                 q = *(p + pos);                             
  22.            *(p + pos) = *(p + i);      
  23.                                 *(p + i) = q;
  24.                         }


  25.         }
  26.         for(i = 0; i < 4; i++)
  27.         printf("%s\n",p++);
  28. }
复制代码

用选择法 把 对应的 字符串 按照 字母升序排列........

最佳答案

查看完整内容

希望对你有帮助{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-12 20:12:04 | 显示全部楼层
本帖最后由 消失在黑暗中 于 2012-12-13 17:18 编辑



  1. #include<stdio.h>
  2. #include<string>
  3. using namespace std;
  4. void sort(char (*p)[5]);
  5. void main()
  6. {
  7.         char a[4][5] = {"wosh", "shi", "chua", "qi"};//二维字符数组的赋值
  8.             sort(a);//函数的调用,这里的a指向char ()[5]类型,以下有说明
  9. }
  10. void sort(char (*p)[5])//这里的p的指针类型为char (*)[5],这里的p不指向类型char,而是指向char ()[5]类型.
  11. {//这里的()[5]就是表示二维数组上的一维,所以p指向一维数组,这一维数组上有5个元素。
  12.         
  13.         int i, j, pos;
  14.         for (i = 0; i<3; i++)//按照楼主的意思,i表示有3种组合比较,这是选择排序的用法,good!。
  15.         {
  16.                 pos = i;
  17.                 for (j=i+1; j<4; j++)//第一组比较3次,第二组比较2次,第二组比较1次,一共比较3次。

  18.                         if(strcmp(*(p + pos), *(p + j))>0)//对数组成员比较
  19.                                                 {
  20.                             char pch[5]= {0};

  21. //定义字符数组,,每次循环pch数组每个元素都为0  
  22. //strcpy(pch, *(p + pos));这里注意p的指针类型,p指向char ()[5]类型,上面提到过。
  23.                                                         
  24. //如果让p指向二维中的一维数组“wosh”,那么p + 1指向"shi",p + 2指向"chua"。
  25.                                                         
  26. //可能这里很费解,你可以理解为编译器的原因导致的这个写法!如果想更深入的了解指针的变态用法,
  27.                                                         
  28. //可以去看专业指针用法的书籍,我觉得会用二维数组的指针就足够了,事实上,多维数组就是一维数组。
  29.                                                         
  30. //可以理解p + pos为一个指针的指针,理解为char **p的定义。*(p + j)指向单个字符的指针,即char *类型指针,
  31. //**(p + j)获取字符。
  32.                                                         
  33. //如果无法接受这种写法strcpy(pch, *(p + pos));可以用strcpy(pch, (char *)(p + pos))代替也行,
  34. //将(p + pos)强制转换成char *类型指针。
  35.                                                         
  36. //以下雷同,不多解释

  37. strcpy (pch, *(p + pos));                                                      
  38. strcpy (*(p + pos), *(p + j));
  39. strcpy (*(p + j), pch);               
  40.                                                 }
  41.         }
  42.         for (i=0; i < 4; i++)
  43.                         printf("%s\n", p++);//这里的p指向每组字符串;
  44. }
复制代码
希望对你有帮助{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-12 20:12:54 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<string.h>
  3. void sort(char (*p)[5]);
  4. void main()
  5. {
  6.         char a[4][5] = {"wosh","shi","chua","qi"};
  7.         sort(a);
  8. }
  9. void sort(char (*p)[5])
  10. {
  11.         int i, j, pos;
  12.         char *q;
  13.         for( i = 0; i < 3; i++ )
  14.         {
  15.                 pos = i;

  16.                 for( j = i+1; j < 4; j++)
  17.                         if( strcmp((p + pos),(p + j)) > 0)
  18.                                 pos = j;

  19.                         if( i != pos)
  20.                         {
  21.                                 q = (p + pos);
  22.                                 (p + pos) = (p + i);
  23.                                 (p + i) = q;
  24.                         }


  25.         }
  26.         for(i = 0; i < 4; i++)
  27.         printf("%s\n",p++);
  28. }
复制代码
哪里有问题了?? 还有 如果这样写有不对 的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-12 20:13:34 | 显示全部楼层
求个位大神 帮帮忙{:7_174:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-12 21:50:38 | 显示全部楼层
容我考虑一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-12 23:58:37 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<string.h>
  3. void sort(char (*p)[5]);
  4. void main()
  5. {
  6.         char a[4][5] = {"wosh","shi","chua","qi"};
  7.                 sort(a);
  8. }
  9. void sort(char (*p)[5])
  10. {
  11.     int i, j, pos;
  12.     char q;
  13.         for(i = 0; i<3; i++)
  14.         {
  15.                 for(j =i+1; j<4; j++)
  16.                 {       
  17.                         if( (*(*p+i)) - ( *(*p+j))) /*比较大小*/
  18.                         {
  19.                                 q = *(*p+i);   /*交换*/
  20.                                 *(*p+i) = *(*p+j);
  21.                                 *(*p+j) = q;                       
  22.                         }
  23.                 }                       
  24.         }
  25.         printf("%s\n",*p);

  26. }

  27. /*
  28.         这是一个数组指针的问题, 首先char[4][5]是一个char[][5]这个类型的数据
  29.         对应的指针就为char(*)[5], 也就是说这是一个指针, 指针指向的是一个数组
  30.         数组的类容都是字符串,也就是指针地址.
  31.        
  32.         *p等价于p 也就是 wosh的地址
  33.          p+1就意味着加了20个字节. 也就是现在p指向了shi
  34.          依次类推...
  35.          
  36.          
  37.          上面的(*p+i)的意思是:  (*p)是wosh的地址, 那(*p+i)那就是指向了o这个字符
  38.          那么*(*p+i)的意思是就是取出o了.
  39.          
  40.          你可以实验一下:
  41.         #include<stdio.h>
  42.         #include<string.h>
  43.        
  44.         int main()
  45.         {
  46.             char a[4][5] = {"wosh","shi","chua","qi"};
  47.                
  48.                 char (*p)[5] = a;
  49.                
  50.                 printf("p = %d\n",sizeof(p));
  51.                
  52.                 printf("%s\n",*p);
  53.                 printf("%c\n",*(*p+1));
  54.        
  55.                 printf("%s\n",*(p+1));
  56.        
  57.                 return 0;
  58.        
  59.         }
  60.          
  61.          这里只对第一个字符做了排序, 我的意思是后面的你自己当作练习
  62.          我相信你会明白的.

  63. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-13 09:16:08 | 显示全部楼层
#include <stdio.h>
#include <string.h>
void sort(char (*p)[5]);

int main()
{
        char a[4][5] = {"wosh","shi","chua","qi"};
        sort(a);
  return 0;
}

void sort(char (*p)[5])
{
        int i,j,pos;
        char q[5];

        for(i = 0;i < 3;i++)
               
        {
                pos = i;
                for(j = i+1;j < 4;j++)
                        if(strcmp(p[pos],p[j]) > 0)  //p+pos不是字符串的首地址,*(p+pos)才是,下面
                                pos = j;                    //情况一样。

                        if(i != pos)
                        {
                                strcpy(q,p[pos]);          //c语言中字符串不能用"="直接赋值。
                                strcpy(p[pos] ,p[i]);
                                strcpy(p[i],q);
                        }
        }
        for(i = 0;i < 4;i++)
                printf("%s\n",*p++);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-13 09:23:30 | 显示全部楼层

RE: 关于数组指针的问题


我理解你的意思,不过我的意思是把整个字符串进行比较,比如字符串w就大于字符串asfff,在if(i != pos)  中,会报错提示*(p+i)  =  *(p +pos)不能这样赋值,我是想把他们的地址进行交换,相当于a[i]=a[pos]但是不能这样赋值?如果改成strcpy(*(p+i),*(p+pos))就对了,不知道这是为什么,?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-13 09:26:16 | 显示全部楼层

RE: 关于数组指针的问题

玩酷子弟lv 发表于 2012-12-13 09:16
#include
#include
void sort(char (*p)[5]);

字符串不能直接赋值,我是把他们的地址进行交换,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-13 10:40:25 | 显示全部楼层
芊芊 发表于 2012-12-13 09:26
字符串不能直接赋值,我是把他们的地址进行交换,

数组元素的地址是常量,不是指针变量,不能像&a[0] = &a[1]这样赋值。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-13 12:23:29 | 显示全部楼层
芊芊 发表于 2012-12-13 09:23
我理解你的意思,不过我的意思是把整个字符串进行比较,比如字符串w就大于字符串asfff,在if(i != pos)  中 ...
  1. #include<stdio.h>
  2. #include<string.h>

  3. int main()
  4. {
  5.         char a[] = "hello";
  6.         char b[] = "world!";
  7.        
  8.         a = b;
  9.        
  10.         return 0;
  11. }
  12. /*
  13.         你这个问题是这样的.
  14.         就想上面的例子, a = b 也是错误的.
  15.         这是因为:
  16.         当数组名作为右值时, 代表的是数组首元素的首地址,相当于&b[0];
  17.         而数组名是不可以当左值的, 我们只能访问数组中某个元素,
  18.         而不能把数组当一个总体进行访问. 所以我们可以把a[i]当做左值,
  19.         而无法把a当作左值

  20. */

  21. /***********************************************/

  22. /*
  23.         其实,你可以这样的. 将数组的地址给一个指针
  24. */

  25. #include <stdio.h>
  26. #include <string.h>

  27. int main()
  28. {
  29.     char a[4][5] = {"wosh","shi","chua","qi"};
  30.        
  31.         char (*p)[5] = a;
  32.        
  33.         char *p1;
  34.         char *p2;
  35.        
  36.         p1 = *(p+1);
  37.         p2 = *(p+2);
  38.         //*(p+1) = *(p+2);
  39.        
  40.         p2 = p1;
  41.        
  42.         printf("p1 = %s\n",p1);
  43.         printf("p2 = %s\n",p2);

  44.         return 0;
  45. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
芊芊 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-13 14:15:08 | 显示全部楼层
“q = (p + pos); (p + pos) = (p + i); (p + i) = q;”虽然是通过指针进行地址之间的交换。但是数据的物理地址已经确定。即(p+0)指向wosh;(p+1)指向shi; (p+2)指向chua;(p+3)指向qi;
至于 strcpy((p+i),(p+pos));为什么不可以,我也不明白。附上我改的代码
===========================================================
#include<stdio.h>
#include<string.h>
void sort(char (*p)[5]);
void main()
{
        char a[4][5] = {"wosh","shi","chua","qi"};
        sort(a);
}
void sort(char (*p)[5])
{
        int i, j, pos;
        char q[5];
        for( i = 0; i < 3; i++ )
        {

                for( j = 0; j < 3-i; j++)
                {
                        if( strcmp(*(p +j+1),*(p + j)) <0)
                        {       
                                strcpy(q ,*(p + j+1));
                                strcpy(*(p + j+1) ,*(p + j));
                                strcpy(*(p + j),q);
                        }
                }
        }
        for(i = 0; i < 4; i++)
                printf("%s\n",p++);
        getchar();
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-16 20:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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