鱼C论坛

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

[已解决]求助一下大神

[复制链接]
发表于 2021-6-3 16:38:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 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[10];

        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[10];

        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-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);这样才是下一个元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[10];

        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-3 19:02:37 | 显示全部楼层
数组名是个 指针常量 不能当左值
只是一个标记  
当右值时就是指针         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-3 21:15:21 | 显示全部楼层
万千只cnm 发表于 2021-6-3 19:02
数组名是个 指针常量 不能当左值
只是一个标记  
当右值时就是指针

就是*(p1) = *(p1+1);为什么不能持续指向下一个单元元素呢 *(P++)就可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你是指那里的     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你 p+1  结果是个值呀  
p本身没有改变   
p +=1 才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-3 21:32:48 | 显示全部楼层
万千只cnm 发表于 2021-6-3 21:27
你 p+1  结果是个值呀  
p本身没有改变   
p +=1 才行

对呀 我把p+1的值 赋值给 p 再进行比较   而且p += 1也是不行的喔
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-3 23:27:36 | 显示全部楼层
g1063496360 发表于 2021-6-3 21:32
对呀 我把p+1的值 赋值给 p 再进行比较   而且p += 1也是不行的喔

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

使用道具 举报

发表于 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);这样才是下一个元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 16:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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