返回信息流本人小白,求知道的人给解答下,万能的byr论坛,玛尼玛尼哄
图一 指针的负号表示什么意思?
图二 编译器怎么知道指针p-3后面还有3个字符可以输出,万一一开始用p=p+10,超出字符串,prinf("%s",p)会报错吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #93131同步于 2016/8/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
求助两个关于C的基本问题
unimit
2016/8/30镜像同步23 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1、指针数据类型记录的是内存的地址,p[n]可以大致理解为*(p+n),正数为向后偏移,负数为向前偏移。
2、C语言是根据0(NULL)来作为字符串的边界。如果找不到边界就一直输出,知道碰到NULL或者崩溃。
1. p[-1]和*(p-1)以及*(p+(-1))的意义完全一样。嗯。完全一样。这是标准规定的,可以依靠的。
2. /* 这个数组有9个元素(1-8,还有一个'\0'),而p+10碰巧指向“最后一个元素之后的一个位置”,在C语言里仍然是有意义的。所以,再减回来是可以的。但是,p+11就不行了,C语言里,超出数组一个元素是可以的,但再往后就不行了。C语言并不保证p+11这样的程序会发生什么事(即:未定义行为)。 */ 不好意思,我少数了一个数。
这个数组有9个元素(1-8,还有一个'\0'),p+9指向“最后一个元素之后的一个位置”,在C语言里仍然是有意义的,再减回来是可以的。但是,p+10就已经是“超出2个元素”了,C语言里,超出数组一个元素是可以的,但再往后就不行了。C语言并不保证p+10这样的程序会发生什么事(即:未定义行为)。
【 在 wk1948 的大作中提到: 】
: 2、C语言是根据0(NULL)来作为字符串的边界。如果找不到边界就一直输出,知道碰到NULL或者崩溃。
是通过'\0'字符,称为NUL字符也是可以的。不是NULL指针。数组越界的结果是“未定义行为”。当然,“一直输出”是很常见的情况。崩溃,或者机器冒烟都是可以的。
相比于java。C的错误检查要简单得多,或者说,没有? p指向一个地址,这个地址有一串字节。至于哪里属于你哪里不属于你,代表什么内容,编译器完全不知道。。也从来不关心,当然运行的时候会检测很多权限啊。。之类的。但是也只是可能会有问题。也可能程序会一直“正常“运行下去。
谢谢,我现在正在看基础的书,就是自学的时候也分不清重点,很多原理要等到碰到具体的问题和例子才能理解。
【 在 wk1948 的大作中提到: 】
: 1、指针数据类型记录的是内存的地址,p[n]可以大致理解为*(p+n),正数为向后偏移,负数为向前偏移。
: 2、C语言是根据0(NULL)来作为字符串的边界。如果找不到边界就一直输出,知道碰到NULL或者崩溃。
多谢多谢,暖神就是给力
【 在 nuanyangyang 的大作中提到: 】
: 1. p[-1]和*(p-1)以及*(p+(-1))的意义完全一样。嗯。完全一样。这是标准规定的,可以依靠的。
: 2. 这个数组有9个元素(1-8,还有一个'\0'),而p+10碰巧指向“最后一个元素之后的一个位置”,在C语言里仍然是有意义的。所以,再减回来是可以的。但是,p+11就不行了,C语言里,超出数组一个元素是可以的,但再往后就不行了。C语言并不保证p+11这样的程序会发生什么事(即:未定义行为)。
【 在 a206206 的大作中提到: 】
: 相比于java。C的错误检查要简单得多,或者说,没有? p指向一个地址,这个地址有一串字节。至于哪里属于你哪里不属于你,代表什么内容,编译器完全不知道。。也从来不关心,当然运行的时候会检测很多权限啊。。之类的。但是也只是可能会有问题。也可能程序会一直“正常“运行下去。
嗯。C/C++语言的逻辑就是:信任程序员。程序员一旦犯错误了,编译器就可以把所有责任扔给程序员,让程序员承担任何后果,让电脑冒烟也可以。这就是为什么我一直不推荐以C/C++作为第一门语言来学习的原因。
谢谢了,哈哈,看来每门语言设计的时候都遵循了某种自己的设计哲学···
【 在 a206206 的大作中提到: 】
: 相比于java。C的错误检查要简单得多,或者说,没有? p指向一个地址,这个地址有一串字节。至于哪里属于你哪里不属于你,代表什么内容,编译器完全不知道。。也从来不关心,当然运行的时候会检测很多权限啊。。之类的。但是也只是可能会有问题。也可能程序会一直“正常“运行下去。
【 在 nuanyangyang 的大作中提到: 】
: 1. p[-1]和*(p-1)以及*(p+(-1))的意义完全一样。嗯。完全一样。这是标准规定的,可以依靠的。
: 2. 这个数组有9个元素(1-8,还有一个'\0'),而p+10碰巧指向“最后一个元素之后的一个位置”,在C语言里仍然是有意义的。所以,再减回来是可以的。但是,p+11就不行了,C语言里,超出数组一个元素是可以的,但再往后就不行了。C语言并不保证p+11这样的程序会发生什么事(即:未定义行为)。
你的意思是p = p+11; 然后 p = p - 11;这样是未定义行为?能给个出处吗?