鱼C论坛

 找回密码
 立即注册
查看: 1826|回复: 13

[已解决]数组指针问题

[复制链接]
发表于 2017-10-25 23:43:33 | 显示全部楼层 |阅读模式

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

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

x
先放程序,大家可以先复制运行一下:
#include<stdio.h>
void main()
{
        int a[10]={9,8,7,6,5,4,3,2,1,0};
        int i,j,k,*p;
       
        printf("**********");
        for(j=0;j<10;j++)
        {
                printf("%d ",*(a+j));
        }
        printf("**********");
        p=a;
        for(k=0;k<10;k++)
        {
                printf("%d ",*(p++));
        }
        printf("**********");
       
}
这个是用来练习用不同方法输出数组的,第一种用数组名具有的首地址特性直接加整型变量 j 。可以正常使用,为什么把*(a+j)变成*(a++)就报错呢?
rror C2105: '++' needs l-value
为什么把a的地址给指针变量p然后*(p++)就可以呢?
最佳答案
2017-10-26 09:17:42
因为数组名a是一个常量,不能被赋值(也就是不能当作左值)
就好像 不能这样做: 5 = 3+4
你定义的指针p指向该数组名,而p是一个变量,可以变化(可以当作左值)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-26 11:07:40 | 显示全部楼层
你这个程序,首先和你说一下有个错误,打印p的值的时候()打成了中文。好了,下面给你分析下:
1. 你应该知道数组的名字就是你这个程序里的 a ,可以当数组名,也可以当第一个数值的地址。这个应该知道吧?
2. 既然 a 你当地址在用,那就是说它是一个实实在在的数字,这个数字代表的是地址。那么你就不能去让数字自增,但是可以让指向这个数字的变量自增。就是你定义的p,p是指向a这个地址的一个指针变量。
或许你没那么容易理解,那么我就用整形来说吧。 a = 1,你可以a++,为什么?因为你的a指向的是1这个数的地址,a++那就是这个地址的后一个地址,是2,对吧。但是你要是 1++,那就不行了,数学里有这个算式吗?没有吧?只能是1+1这样吧。所以这里只能 a + j 。
3. 也就是指针 p ,要是你理解了第二条就别看了,看了浪费你时间。 p 就是指向 a ,那前面说了,a是地址,相当于a是一个实实在在的数字。数字不能自增,但是 p 是变量,当然可以了。
是不是觉得懵懵的?没关系,再看一遍,还是不行?点“回复”,说出你理解后的问题点,一个一个理解过来就懂了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-26 00:11:57 | 显示全部楼层
看了你的代码我怀疑人生
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 00:17:55 | 显示全部楼层
本帖最后由 前路 于 2017-10-26 00:42 编辑

“+ +”需要左值
左值相当于地址值,
右值相当于数据值。
右值指的是引用了一个存储在某个内存地址里的数据。
*(a ++ ) <=> *a[](这是一个数据值,不是一个地址值) = *a[] (这是一个数据值,不是一个地址值)+ 1
就相当于  “变量” +“常量”只能存入 “变量 ”中一样。
反例  4 = 3 + x 是不成立的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-26 00:32:50 | 显示全部楼层
对你有帮助

来自CSDNlistenerRi

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

使用道具 举报

发表于 2017-10-26 00:36:43 | 显示全部楼层
本帖最后由 鱼c开挂帐号 于 2017-10-26 00:40 编辑
前路 发表于 2017-10-26 00:17
*(a++)直接对内存中的值进行加 1 并且将结果写入内存, 然而这的内存是a[]的空间,是不允许改动的.
*(a+j)  ...


通俗的讲就是,a+j的值是9,*9的地址变为%d输出,还是9.但是a++直接把值的地址改了,有%D输出,应该没有东西输出,可能是未分配的地址,要是该地址有值的话,会输出结果的比如还是输出了整个a【】的元素,可能就是这个原因


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

使用道具 举报

发表于 2017-10-26 00:52:00 | 显示全部楼层
鱼c开挂帐号 发表于 2017-10-26 00:36
通俗的讲就是,a+j的值是9,*9的地址变为%d输出,还是9.但是a++直接把值的地址改了,有%D输出,应该没 ...

*9的地址变为%d输出,不是9而是存放9的地址。
这儿的*a++与*(a++)是不同的表达式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-26 01:53:01 | 显示全部楼层
楼上的回答俺看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-26 02:09:37 | 显示全部楼层
技术员 发表于 2017-10-26 01:53
楼上的回答俺看不懂

你的程序能运行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 02:32:48 | 显示全部楼层
前路 发表于 2017-10-26 00:52
*9的地址变为%d输出,不是9而是存放9的地址。
这儿的*a++与*(a++)是不同的表达式

我承让我有的东西学不到家,但是,符号的优先级我还是懂的。

我们说的东西差不多是一个意思,存放9的地址用%d来输出,但是,为什么没有非法间接。

*9非法间接,*(a+b)非法间接。可是他的为什么没有?竟然通过了。为什么?我的VC内部是怎么弄的,到底是怎么个运行法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 09:17:42 | 显示全部楼层    本楼为最佳答案   
因为数组名a是一个常量,不能被赋值(也就是不能当作左值)
就好像 不能这样做: 5 = 3+4
你定义的指针p指向该数组名,而p是一个变量,可以变化(可以当作左值)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 16:25:38 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-26 11:07
你这个程序,首先和你说一下有个错误,打印p的值的时候()打成了中文。好了,下面给你分析下:
1. 你应该 ...

还是不是很懂。。。。。为什么*(a+b)两个变量相加是非法间接而一个是数组的前地址就可以运行了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-26 17:33:13 | 显示全部楼层

有个括号用的中文括号,改回来就可以了,这个问题我搞明白了,a是一个地址是常量,不是变量所以不能用++。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 19:28:15 | 显示全部楼层
鱼c开挂帐号 发表于 2017-10-26 16:25
还是不是很懂。。。。。为什么*(a+b)两个变量相加是非法间接而一个是数组的前地址就可以运行了?

你说错了,a、b两个变量当然是可以的,指针也是可以的。唯独常量不行,就是实实在在的数不行。
这么说吧,你看楼主的问题,是不是说a++就不行?你再想,数组名字是不是代表地址?牢记这句话,代表地址,那是实实在在看到的数(地址也是数字)。就像门牌和人一样,形形色色的人分别叫变量、指针,他们今天可以住这里,明天可以住那里,但是数字(门牌)是不会改变的。
结合起来就是说,a代表地址,地址改变不了,所以非法。指针可以改变,所以++合法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 18:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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