yzz123 发表于 2020-10-14 21:50:28

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

#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;
   }
   
}

yzz123 发表于 2020-10-14 21:51:16

如图所示,就是一个用指针比大小的程序

风过无痕1989 发表于 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 ),而不是一个地址。

yzz123 发表于 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;
   }
   
   
}
你好,我修改了程序,这个程序可以运行,但是为啥不能变换大小呢

yzz123 发表于 2020-10-15 21:16:59

风过无痕1989 发表于 2020-10-15 09:27
程序是错误的 !

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

我知道是我下面的无法返回值,大佬能告诉我是啥原理,我把函数删了,加在主函数里,就有用,那应该怎样修改才比较好呢?

yzz123 发表于 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,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>a)
                        {
                                g=a;
                                a=a;
                                a=g;
                        }
                       
}
为啥我这个不行呢,大神麻烦了,初学者不太懂

风过无痕1989 发表于 2020-10-15 22:34:07

yzz123 发表于 2020-10-15 21:12
#include
int main()
{


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

回到主题,要想调用函数进行交换,就得将地址(指针其实也是传地址)作为实参传给函数

风过无痕1989 发表于 2020-10-15 23:02:52

#include<stdio.h>
int main()
{
    void max(int *b,int *c,int *d);
    int *p1,*p2,*p3,b,c,d;
    scanf("%d %d %d",&b,&c,&d);
    p1 = &b;
    p2 = &c;
    p3 = &d;
    max(p1,p2,p3);
    printf("%d %d %d\n",b,c,d);
}
void max(int *b,int *c,int *d)
{
    int temp = 0;
    if(*b < *c)
    {
         temp = *b;
         *b = *c;
         *c = temp;
    }
    if(*b < *d)
    {
         temp = *b;
         *b = *d;
         *d = temp;
    }
    if(*c < *d)
    {
         temp = *c;
         *c = *d;
         *d = temp;
    }

}
页: [1]
查看完整版本: 为啥指针变量不能+1在赋予它地址呢?哪位大神能解答一下