鱼C论坛

 找回密码
 立即注册
查看: 1134|回复: 7

[已解决]为啥指针变量不能+1在赋予它地址呢?哪位大神能解答一下

[复制链接]
发表于 2020-10-14 21:50:28 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
int main()
{
        void max(int b,int c,int d);
        int *a,b,c,d,i;
        scanf("%d %d %d",&b,&c,&d);
                a=&b;
        a+1=&c;
        a+2=&d;
        max(b,c,d);
        printf("%d %d %d",*a,*a+1,*a+2);
}
void max(int b,int c,int d)
{  int e;
   if(b>c)
   {
           e=b;
           b=c;
           c=e;
   }
   if(b>d)
   {
           e=b;
           b=d;
           d=e;
   }
   if(c>d)
   {
           e=c;
           c=d;
           d=e;
   }
   
}
最佳答案
2020-10-15 23:02:52
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     void max(int *b,int *c,int *d);
  5.     int *p1,*p2,*p3,b,c,d;
  6.     scanf("%d %d %d",&b,&c,&d);
  7.     p1 = &b;
  8.     p2 = &c;
  9.     p3 = &d;
  10.     max(p1,p2,p3);
  11.     printf("%d %d %d\n",b,c,d);
  12. }
  13. void max(int *b,int *c,int *d)
  14. {  
  15.     int temp = 0;
  16.     if(*b < *c)
  17.     {
  18.            temp = *b;
  19.            *b = *c;
  20.            *c = temp;
  21.     }
  22.     if(*b < *d)
  23.     {
  24.            temp = *b;
  25.            *b = *d;
  26.            *d = temp;
  27.     }
  28.     if(*c < *d)
  29.     {
  30.            temp = *c;
  31.            *c = *d;
  32.            *d = temp;
  33.     }

  34. }
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-14 21:51:16 | 显示全部楼层
如图所示,就是一个用指针比大小的程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-15 09:27:34 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-10-15 09:55 编辑

程序是错误的 !

变量定义时,系统即为其分配地址,初始化,即向该地址中填充数据。定义int a 时,编译器分配4个字节内存,并命名该4个字节的空间名字为a(即变量名),当用到变量名a时,就是在使用那4个字节的内存空间;同样,也会给 b、c、d 分配地址,但编译器并没有保证让他们的地址连续。

这好比一群好朋友外出旅行住宾馆,如果没有预约,宾馆方面可以保证让你们都住下,却不能保证让你们都住在同一层楼,更不能保证让你们的房间号挨着,甚至不能保证让你们住在同一幢楼。
但如果你事先有预约,他们会安排。这又好比数组、字符串、结构体等。

所以,你的程序在编译时,系统会告诉你 a + 1 = &c、a + 2 = &d 是错误的,它会要求右侧是一个值( error C2106: '=' : left operand must be l-value ),而不是一个地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-15 21:12:54 | 显示全部楼层
风过无痕1989 发表于 2020-10-15 09:27
程序是错误的 !

变量定义时,系统即为其分配地址,初始化,即向该地址中填充数据。定义int a 时,编译 ...

#include<stdio.h>
int main()
{
        void max(int b,int c,int d);
          int *a,*e,*f,b,c,d,i;
        scanf("%d %d %d",&b,&c,&d);
                a=&b;
        e=&c;
        f=&d;
        max(b,c,d);
                printf("%d %d %d",*a,*e,*f);
}
void max(int b,int c,int d)
{  int e;
   if(b>c)
   {
           e=b;
           b=c;
           c=e;
   }
   if(b>d)
   {
           e=b;
           b=d;
           d=e;
   }
   if(c>d)
   {
           e=c;
           c=d;
           d=e;
   }
   
   
}
你好,我修改了程序,这个程序可以运行,但是为啥不能变换大小呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-15 21:16:59 | 显示全部楼层
风过无痕1989 发表于 2020-10-15 09:27
程序是错误的 !

变量定义时,系统即为其分配地址,初始化,即向该地址中填充数据。定义int a 时,编译 ...

我知道是我下面的无法返回值,大佬能告诉我是啥原理,我把函数删了,加在主函数里,就有用,那应该怎样修改才比较好呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-15 21:46:01 | 显示全部楼层
风过无痕1989 发表于 2020-10-15 09:27
程序是错误的 !

变量定义时,系统即为其分配地址,初始化,即向该地址中填充数据。定义int a 时,编译 ...

#include<stdio.h>
int main()
{
          int qipaofa(int a[]);
          int *e,a[3],i;
           int v;
           for(i=0;i<3;i++)
           scanf("%d",a);
          
     e=qipaofa(a);
          printf("%d,%d,%d",*e,*(e+1).*(e+2));
}
int qipaofa(int a[])
{
        int g,j,k;
        for(j=0;j<2;j++)
                for(k=0;k<2-j;k++)
                        if(a[k]>a[k+1])
                        {
                                g=a[k];
                                a[k]=a[k+1];
                                a[k+1]=g;
                        }
                       
}
为啥我这个不行呢,大神麻烦了,初学者不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-15 22:34:07 | 显示全部楼层
yzz123 发表于 2020-10-15 21:12
#include
int main()
{

主函数调用函数来进行数据交换,直接调用是无法完成的,虽然你定义的那个函数的参数(形式参数)与主函数调用时的的实参是同名的,但它们并非是同一个 b (或 c,或 d)。举个例子说吧:长江路 180 号有一个李建国,黄河路 180 号也有一个李建国,它们不过是同名同姓而已,并非是同一个人。

回到主题,要想调用函数进行交换,就得将地址(指针其实也是传地址)作为实参传给函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-15 23:02:52 | 显示全部楼层    本楼为最佳答案   
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     void max(int *b,int *c,int *d);
  5.     int *p1,*p2,*p3,b,c,d;
  6.     scanf("%d %d %d",&b,&c,&d);
  7.     p1 = &b;
  8.     p2 = &c;
  9.     p3 = &d;
  10.     max(p1,p2,p3);
  11.     printf("%d %d %d\n",b,c,d);
  12. }
  13. void max(int *b,int *c,int *d)
  14. {  
  15.     int temp = 0;
  16.     if(*b < *c)
  17.     {
  18.            temp = *b;
  19.            *b = *c;
  20.            *c = temp;
  21.     }
  22.     if(*b < *d)
  23.     {
  24.            temp = *b;
  25.            *b = *d;
  26.            *d = temp;
  27.     }
  28.     if(*c < *d)
  29.     {
  30.            temp = *c;
  31.            *c = *d;
  32.            *d = temp;
  33.     }

  34. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 04:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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