鱼C论坛

 找回密码
 立即注册
查看: 1281|回复: 9

[已解决]指针

[复制链接]
发表于 2020-3-26 16:52:18 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
void reverse(int *x,int n);
void main()
{
        int i;
        int a[]={3,7,9,11,0,6,7,5,4,2};
        printf("原来的顺序:");
        for(i=0;i<10;i++)
        {
                printf("%d",a[i]);
        }
        reverse(a,10);
        printf("变换后的顺序:");
        for(i=0;i<10;i++)
        {
                printf("%d",a[i]);
         }
       
}
void reverse(int *x,int n)
{
        int m,*i,*j,temp,*p;
        i=x;
        m=(n-1)/2;
        j=x+n-1;
        p=m+x;
        for(;i<=p;i++,j--)
        {
        temp=*i;
        *i=*j;
        *j=temp;
}
}
问题:下面的m=(n-1)/2;
        j=x+n-1;
        p=m+x;表示什么
最佳答案
2020-3-27 09:25:14
本帖最后由 良弓无箭 于 2020-3-27 09:46 编辑
kukiJJY 发表于 2020-3-26 23:35
#include
int max,min;


你的这段代码都不能运行。最大的错误是数组不能直接传递,否则便会得到一堆垃圾值。先不说你能不能看懂。你的这段代码本来就有BUG。这是书上的代码?
这是我修改后的代码:
  1. #include<stdio.h>
  2. int max,min;

  3. void max_min_value(int array[],int n);

  4. int main()
  5. {
  6.         int i,number[10];
  7.         printf("enter 10 integer numbers:\n");
  8.         for(i=0;i<10;i++)
  9.         {
  10.             scanf("%d",&number[i]);//注意:像代码中那样写根本就无法为数组赋值。
  11.         }
  12.         max_min_value(number,10);
  13.         printf("max=%d,min=%d\n",max,min);
  14.         return 0;
  15. }
  16. void max_min_value(int number[],int n)
  17. {
  18.         int *p,*array_end;
  19.         array_end=number+n;//number是数组的首地址,number+n是数组的最后一个地址。
  20.         max=min=*number;//为max和min赋值。
  21.         for(p=number;p<array_end;p++)//从数组的第一个数的地址开始遍历整个数组。即从首地址移动到最后一个地址。
  22.         {
  23.             if(*p>max)
  24.             {
  25.                 max=*p;
  26.             }
  27.             else if (*p<min)
  28.             {
  29.                 min=*p;
  30.             }
  31.         }
  32. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-26 16:53:07 | 显示全部楼层
这个x是为什么要加上?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 17:13:04 | 显示全部楼层
如果不明白的话在追问我。
  1. #include<stdio.h>
  2. void reverse(int *x,int n);
  3. void main(void)
  4. {
  5.         int i;
  6.         int a[]={3,7,9,11,0,6,7,5,4,2};
  7.         printf("原来的顺序:");
  8.         for(i=0;i<10;i++)
  9.         {
  10.                 printf("%d ",a[i]);
  11.         }
  12.         reverse(a,10);
  13.         putchar('\n');
  14.         printf("变换后的顺序:");
  15.         for(i=0;i<10;i++)
  16.         {
  17.                 printf("%d ",a[i]);
  18.         }
  19.       
  20. }
  21. void reverse(int *x,int n)
  22. {
  23.         int m,*i,*j,temp,*p;
  24.         i=x;
  25.         m=(n-1)/2;//定位中间的元素。
  26.         j=x+n-1;//这里指向x数组中的最后一个元素。
  27.         p=m+x;//这里指向x数组中的中间的元素。
  28.         for(;i<=p;i++,j--)//条件的意思是如果想要反转数组只需要前后数组中第一个数和最后一个数,第二个数和倒数第二个数交换即可。
  29.         {
  30.         temp=*i;
  31.         *i=*j;
  32.         *j=temp;
  33.         }
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 17:14:23 | 显示全部楼层
学习一下,四处看看!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 17:41:52 | 显示全部楼层
良弓无箭 发表于 2020-3-26 17:13
如果不明白的话在追问我。

追问一下   void reverse(int array[],int n)
{
        int *array_end,*p;
        array_end=array+n;
        max=min=*array;
        for(p=array+1;p<array_end;p++)
        {
                if(*p>max)
                  max=*p;
                  else if(*p<min)
                  min=*p;
那这里的 max=min=*array 和for里面的东西表示的是什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 19:13:37 | 显示全部楼层
kukiJJY 发表于 2020-3-26 17:41
追问一下   void reverse(int array[],int n)
{
        int *array_end,*p;

这段代码的目的是啥?反转还是排序?你要说明白。另外max和min也没有定义。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 23:35:05 | 显示全部楼层
良弓无箭 发表于 2020-3-26 19:13
这段代码的目的是啥?反转还是排序?你要说明白。另外max和min也没有定义。

#include<stdio.h>
int max,min;

void max_min_value(int array[],int n);

void main()
{
        int i,number[10];
        printf("enter10 integer numbers:\n");
        for(i=0;i<10;i++)
        {
                scanf("%d",&number[i]);
        }
        max_min_value(number,10);
        printf("\n max=%d,min=%d\n",max,min);
}
void max_min_value(int array[],int n)
{
        int *p,*array_end;
        array_end=array+n;
        max=min=*array;
        for(p=array+1;p<array_end;p++)
        {
                if(*p>max)
                {
                        max=*p;
                }
                else if (*p<min)
                {
                        min=*p;
                }
        }
}
这是完整的代码,我想知道array_end=array+n;
        max=min=*array;
        for(p=array+1;p<array_end;p++)
        这部分各自什么意思 ,看了一下午没看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 09:17:17 From FishC Mobile | 显示全部楼层
array_end = array + n 意思是将array_end指向array这个数组最后一个元素的地址,目的是为了下面的for循环可以循环n-1次
max = min = * array;意思是对max和min这两个变量赋值  使得他们等于array这个数组的首个元素
for(p=array+1;p<array_end;p++)意思是 p等于array这个数组第二个元素的地址;如果p小于array_end的地址;就会执行循环;p地址就会加一。     因为array是个数组,它里面的元素的地址是连续的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 09:25:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 良弓无箭 于 2020-3-27 09:46 编辑
kukiJJY 发表于 2020-3-26 23:35
#include
int max,min;


你的这段代码都不能运行。最大的错误是数组不能直接传递,否则便会得到一堆垃圾值。先不说你能不能看懂。你的这段代码本来就有BUG。这是书上的代码?
这是我修改后的代码:
  1. #include<stdio.h>
  2. int max,min;

  3. void max_min_value(int array[],int n);

  4. int main()
  5. {
  6.         int i,number[10];
  7.         printf("enter 10 integer numbers:\n");
  8.         for(i=0;i<10;i++)
  9.         {
  10.             scanf("%d",&number[i]);//注意:像代码中那样写根本就无法为数组赋值。
  11.         }
  12.         max_min_value(number,10);
  13.         printf("max=%d,min=%d\n",max,min);
  14.         return 0;
  15. }
  16. void max_min_value(int number[],int n)
  17. {
  18.         int *p,*array_end;
  19.         array_end=number+n;//number是数组的首地址,number+n是数组的最后一个地址。
  20.         max=min=*number;//为max和min赋值。
  21.         for(p=number;p<array_end;p++)//从数组的第一个数的地址开始遍历整个数组。即从首地址移动到最后一个地址。
  22.         {
  23.             if(*p>max)
  24.             {
  25.                 max=*p;
  26.             }
  27.             else if (*p<min)
  28.             {
  29.                 min=*p;
  30.             }
  31.         }
  32. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 10:39:46 | 显示全部楼层
  数值传递那里打少了  我要知道的大体是懂了  多谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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