鱼C论坛

 找回密码
 立即注册
查看: 2281|回复: 7

[已解决]c指针的下标为负值的含义?

[复制链接]
发表于 2020-9-28 13:40:03 | 显示全部楼层 |阅读模式

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

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

x
比如 定义一个 数组 int array[3]={1,2,3}
然后定义个 指针 int *p=array;
然后打印 指针的值
printf("%d',p[-1]);
可以正常编译,然后出来一个地址一样的东西.
所以指针的下标就是当前位置前移/后移多少个和指针类型相同的数据喽?负数就是前移,正数就是后移?
最佳答案
2020-9-28 14:34:49
C语言数组下标从0开始,没有负数。
下标加一,指针小侯移动一个该类型的宽度,指向下一个地址。
但是也没有规定下标为负数就出错。

你可以看看下标为负数和下标为正数时候的地址差异,可以看出来,下标为负数的时候地址的确是向前移动的。
这样的话,你写这个下标为-1,然后打印该值,打印出来的就是该地址的内容,但是该内容有什么意义呢?这不是你定义的变量,只是内存中的某一个单元的值。
#include<stdio.h>

int main(){
    int a[3]={1,2,3},b[4]={4,5,6,7},c[2]={8,9};
    int*p=b;
    for (int i=-4;i<6;i++)
        printf("地址%p的值是%d\n",&p[i],p[i]);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-28 14:15:55 | 显示全部楼层
下标 是从0开始。且是正数。
你搞个 -1 这不明显违反了规则。
没有负数就是前移的说法。
事实证明,你打印的 %d p[-1] 就是 %p *p指向的array的地址转成10进制形式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-28 14:27:04 | 显示全部楼层
emm,我没法发图片,但我同时打印出array的地址和p[-1],p[3],p[4]的时候,发现p和array的地址不一样,然后3个p的值是一样的,都是- 858993460,这个是啥原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 14:34:49 | 显示全部楼层    本楼为最佳答案   
C语言数组下标从0开始,没有负数。
下标加一,指针小侯移动一个该类型的宽度,指向下一个地址。
但是也没有规定下标为负数就出错。

你可以看看下标为负数和下标为正数时候的地址差异,可以看出来,下标为负数的时候地址的确是向前移动的。
这样的话,你写这个下标为-1,然后打印该值,打印出来的就是该地址的内容,但是该内容有什么意义呢?这不是你定义的变量,只是内存中的某一个单元的值。
#include<stdio.h>

int main(){
    int a[3]={1,2,3},b[4]={4,5,6,7},c[2]={8,9};
    int*p=b;
    for (int i=-4;i<6;i++)
        printf("地址%p的值是%d\n",&p[i],p[i]);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 17:08:22 | 显示全部楼层
定义 p = array,就是将数组的首地址赋给指针变量 p ,比如 p 地址(也就是数组的首地址) 是 0x200000,那么,地址 0x199999 及之前的地址,数组之后 0x200013 之后的地址可以百分之百的肯定,它们是存在的,只不过它们对于我们的程序来说,已经越界了,所以,这些地址里存贮的数据也就是不可预知的,我们也没有必要去理会它们。

回到你的问题,p[-1] 甚至 p[-10] 或负更多,这些个地址能够输出也就再正常不过了,只是输出的地址是可以确定的而地址里存贮的数据是无法预知的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-28 18:50:01 | 显示全部楼层
不错,就是前移。一般不会用这个。程序员不用,难保黑客不用,所以最好加个检查。
这个对程序员来说没有意义。另外,要想打出十六进制地址形式,一个简单方法就是%p
而不是%d。P大写,地址就会以大写字母给出,P小写,地址就会以小写字母给出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-29 06:50:27 From FishC Mobile | 显示全部楼层
小Saber 发表于 2020-9-28 14:27
emm,我没法发图片,但我同时打印出array的地址和p[-1],p[3],p[4]的时候,发现p和array的地址不一样,然后3个p ...

我也试过,几个指针的地址一样,但用比较就会发现虽然输出一样,但比较得出的结论是不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 13:22:06 | 显示全部楼层
召唤风云 发表于 2020-9-29 06:50
我也试过,几个指针的地址一样,但用比较就会发现虽然输出一样,但比较得出的结论是不一样

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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