c指针的下标为负值的含义?
比如 定义一个 数组 int array={1,2,3}然后定义个 指针 int *p=array;
然后打印 指针的值
printf("%d',p[-1]);
可以正常编译,然后出来一个地址一样的东西.
所以指针的下标就是当前位置前移/后移多少个和指针类型相同的数据喽?负数就是前移,正数就是后移?
下标 是从0开始。且是正数。
你搞个 -1 这不明显违反了规则。
没有负数就是前移的说法。
事实证明,你打印的 %d p[-1] 就是 %p *p指向的array的地址转成10进制形式。 emm,我没法发图片,但我同时打印出array的地址和p[-1],p,p的时候,发现p和array的地址不一样,然后3个p的值是一样的,都是- 858993460,这个是啥原因 C语言数组下标从0开始,没有负数。
下标加一,指针小侯移动一个该类型的宽度,指向下一个地址。
但是也没有规定下标为负数就出错。
你可以看看下标为负数和下标为正数时候的地址差异,可以看出来,下标为负数的时候地址的确是向前移动的。
这样的话,你写这个下标为-1,然后打印该值,打印出来的就是该地址的内容,但是该内容有什么意义呢?这不是你定义的变量,只是内存中的某一个单元的值。
#include<stdio.h>
int main(){
int a={1,2,3},b={4,5,6,7},c={8,9};
int*p=b;
for (int i=-4;i<6;i++)
printf("地址%p的值是%d\n",&p,p);
return 0;
} 定义 p = array,就是将数组的首地址赋给指针变量 p ,比如 p 地址(也就是数组的首地址) 是 0x200000,那么,地址 0x199999 及之前的地址,数组之后 0x200013 之后的地址可以百分之百的肯定,它们是存在的,只不过它们对于我们的程序来说,已经越界了,所以,这些地址里存贮的数据也就是不可预知的,我们也没有必要去理会它们。
回到你的问题,p[-1] 甚至 p[-10] 或负更多,这些个地址能够输出也就再正常不过了,只是输出的地址是可以确定的而地址里存贮的数据是无法预知的。 不错,就是前移。一般不会用这个。程序员不用,难保黑客不用,所以最好加个检查。
这个对程序员来说没有意义。另外,要想打出十六进制地址形式,一个简单方法就是%p
而不是%d。P大写,地址就会以大写字母给出,P小写,地址就会以小写字母给出。 小Saber 发表于 2020-9-28 14:27
emm,我没法发图片,但我同时打印出array的地址和p[-1],p,p的时候,发现p和array的地址不一样,然后3个p ...
我也试过,几个指针的地址一样,但用比较就会发现虽然输出一样,但比较得出的结论是不一样 召唤风云 发表于 2020-9-29 06:50
我也试过,几个指针的地址一样,但用比较就会发现虽然输出一样,但比较得出的结论是不一样
哪路阔多
页:
[1]