g1063496360 发表于 2021-6-3 16:38:16

求助一下大神

本帖最后由 g1063496360 于 2021-6-3 21:14 编辑

#include <stdio.h>

int main()
{
        int a[]={1,3,5,7,9},
                b[]={2,4,6,8,10},
                c;

        int *p1=a, *p2=b, i;

        for (i=0; i<10; i++)
        {
                if( *(p1) > *(p2) )
                {
                        c[ i ] = *(p2);
                *(p2) = *(p2+1);
                }
                else
                {
                        c[ i ] = *(p1);
                *(p1) = *(p1+1);
                }
        }
        for (i=0; i<10; i++)
        {
                printf("%2d",c);
        }
        printf("\n\n");
        return 0;
}





#include <stdio.h>

int main()
{
        int a[]={1,3,5,7,9},
                b[]={2,3,6,8,10},
                c;

        int *p1=a, *p2=b, i;

        for (i=0; i<10; i++)
        {
                if( *(p1) > *(p2) )
                {
                        c[ i ] = *(p2);
                *(p2++);
                }
                else
                {
                        c[ i ] = *(p1);
                *(p1++);
                }
        }
        for (i=0; i<10; i++)
        {
                printf(" %d",c);
        }
        printf("\n\n");
        return 0;
}



将两个有序的数组合并成一个有序的数组 请问一下大神为什么第一个程序运行不对呢 谢谢大神!

沙包毛玉 发表于 2021-6-3 18:34:18

c是数组,他是一个地址常量 你选择结构中尝试将p1/p2指针中存放的值赋值给常量自然就会报错。
#include <stdio.h>

int main()
{
      int a[]={1,3,5,7,9},
            b[]={2,4,6,8,10},
            c;

      int *p1=a, *p2=b, i,j,k;

      for (i=0,j=0,k=0; k<10; k++)
      {
                        if(*(p1 + i) > *(p2 + j))
                        {
                                *(c + k) = *(p2 + j);
                                j++;
                        }
                        else
                        {
                                *(c + k) = *(p1 + i);
                                i++;
                        }
      }
      for (k=0; k<10; k++)
      {
                printf("%2d ",*(c+k));
      }
      printf("\n\n");
      return 0;
}

万千只cnm 发表于 2021-6-3 19:02:37

数组名是个 指针常量 不能当左值
只是一个标记
当右值时就是指针         

g1063496360 发表于 2021-6-3 21:15:21

万千只cnm 发表于 2021-6-3 19:02
数组名是个 指针常量 不能当左值
只是一个标记
当右值时就是指针

就是*(p1) = *(p1+1);为什么不能持续指向下一个单元元素呢 *(P++)就可以

万千只cnm 发表于 2021-6-3 21:25:48

g1063496360 发表于 2021-6-3 21:15
就是*(p1) = *(p1+1);为什么不能持续指向下一个单元元素呢 *(P++)就可以

你是指那里的   

万千只cnm 发表于 2021-6-3 21:27:09

g1063496360 发表于 2021-6-3 21:15
就是*(p1) = *(p1+1);为什么不能持续指向下一个单元元素呢 *(P++)就可以

你 p+1结果是个值呀
p本身没有改变   
p +=1 才行

g1063496360 发表于 2021-6-3 21:32:48

万千只cnm 发表于 2021-6-3 21:27
你 p+1结果是个值呀
p本身没有改变   
p +=1 才行

对呀 我把p+1的值 赋值给 p 再进行比较   而且p += 1也是不行的喔

万千只cnm 发表于 2021-6-3 23:27:36

g1063496360 发表于 2021-6-3 21:32
对呀 我把p+1的值 赋值给 p 再进行比较   而且p += 1也是不行的喔

{:5_104:}

桃花飞舞 发表于 2021-6-4 00:24:14

本帖最后由 桃花飞舞 于 2021-6-4 14:35 编辑

怎么两个输出的数据都不正确呢?不过以我愚见 *(p1++);和*(p1) = *(p1+1);是不一样的,怎么说呢 ? 我们先把两个语句的*号去掉,p1++;和 p1=p1+1; 指向数组a的下一个元素的地址即a+1 ==> (unsigned int)a+1*sizeof(*a)然而a它从指针的角度它是指向了数组的第一个元素数组的第一个元素是int类型==>(unsigned int)a+1*sizeof(int)==>(unsigned int)a + 1*4 所以*(p1++)和*(p1+1)就都是数组a的下一个元素。*(p1++);执行时在括号里边先p1++,p1的值为(unsigned int)p1+1*sizeof(*a)==>(unsigned int)p1+1*sizeof(int)==>(unsigned int)p1+1*4。而*(p1)= *(p1+1)执行时根据运算优先级等号左边*(p1)是数组a的当前元素等号右边*(p1+1)是数组a的下一个元素而这时p1的值为(unsigned int)p1且p1值并未改变因为运算符的优先级先运算最后赋值,*(p1=p1+1);这样才是下一个元素。

g1063496360 发表于 2021-6-4 12:09:37

桃花飞舞 发表于 2021-6-4 00:24
怎么两个输出的数据都不正确呢?不过以我愚见 *(p1++);和*(p1) = *(p1+1);是不一样的,怎么说呢 ? 我们先把 ...

感谢!
页: [1]
查看完整版本: 求助一下大神