数组指针问题
先放程序,大家可以先复制运行一下:#include<stdio.h>
void main()
{
int a={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++)就可以呢? 你这个程序,首先和你说一下有个错误,打印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 是变量,当然可以了。
是不是觉得懵懵的?没关系,再看一遍,还是不行?点“回复”,说出你理解后的问题点,一个一个理解过来就懂了。{:10_256:} 看了你的代码我怀疑人生 本帖最后由 前路 于 2017-10-26 00:42 编辑
“+ +”需要左值
左值相当于地址值,
右值相当于数据值。
右值指的是引用了一个存储在某个内存地址里的数据。
*(a ++ ) <=> *a[](这是一个数据值,不是一个地址值) = *a[] (这是一个数据值,不是一个地址值)+ 1
就相当于“变量” +“常量”只能存入 “变量 ”中一样。
反例4 = 3 + x 是不成立的。 对你有帮助 本帖最后由 鱼c开挂帐号 于 2017-10-26 00:40 编辑
前路 发表于 2017-10-26 00:17
*(a++)直接对内存中的值进行加 1 并且将结果写入内存, 然而这的内存是a[]的空间,是不允许改动的.
*(a+j)...
通俗的讲就是,a+j的值是9,*9的地址变为%d输出,还是9.但是a++直接把值的地址改了,有%D输出,应该没有东西输出,可能是未分配的地址,要是该地址有值的话,会输出结果的{:10_279:}比如还是输出了整个a【】的元素,可能就是这个原因{:10_297:}
也不知道对不对。{:10_258:} 鱼c开挂帐号 发表于 2017-10-26 00:36
通俗的讲就是,a+j的值是9,*9的地址变为%d输出,还是9.但是a++直接把值的地址改了,有%D输出,应该没 ...
*9的地址变为%d输出,不是9而是存放9的地址。
这儿的*a++与*(a++)是不同的表达式
楼上的回答俺看不懂 技术员 发表于 2017-10-26 01:53
楼上的回答俺看不懂
你的程序能运行? 前路 发表于 2017-10-26 00:52
*9的地址变为%d输出,不是9而是存放9的地址。
这儿的*a++与*(a++)是不同的表达式
我承让我有的东西学不到家,但是,符号的优先级我还是懂的。
我们说的东西差不多是一个意思,存放9的地址用%d来输出,但是,为什么没有非法间接。
*9非法间接,*(a+b)非法间接。可是他的为什么没有?竟然通过了。为什么?我的VC内部是怎么弄的,到底是怎么个运行法。 因为数组名a是一个常量,不能被赋值(也就是不能当作左值)
就好像 不能这样做: 5 = 3+4
你定义的指针p指向该数组名,而p是一个变量,可以变化(可以当作左值) 丶忘却的年少o 发表于 2017-10-26 11:07
你这个程序,首先和你说一下有个错误,打印p的值的时候()打成了中文。好了,下面给你分析下:
1. 你应该 ...
还是不是很懂。。。。。为什么*(a+b)两个变量相加是非法间接而一个是数组的前地址就可以运行了? 鱼c开挂帐号 发表于 2017-10-26 02:09
你的程序能运行?
有个括号用的中文括号,改回来就可以了,这个问题我搞明白了,a是一个地址是常量,不是变量所以不能用++。 鱼c开挂帐号 发表于 2017-10-26 16:25
还是不是很懂。。。。。为什么*(a+b)两个变量相加是非法间接而一个是数组的前地址就可以运行了?
你说错了,a、b两个变量当然是可以的,指针也是可以的。唯独常量不行,就是实实在在的数不行。
这么说吧,你看楼主的问题,是不是说a++就不行?你再想,数组名字是不是代表地址?牢记这句话,代表地址,那是实实在在看到的数(地址也是数字)。就像门牌和人一样,形形色色的人分别叫变量、指针,他们今天可以住这里,明天可以住那里,但是数字(门牌)是不会改变的。
结合起来就是说,a代表地址,地址改变不了,所以非法。指针可以改变,所以++合法。
页:
[1]