我正在写一个程序,模拟乌龟和野兔之间的比赛.

它们都沿着由70个元素组成的两个不同的一维数组移动,当然,由于它们向前和向后移动,它们可能最终会超过元素0或69.

我想使用指针比较来判断它们是否这样做,所以问题来了:

我知道,如果我们比较指向同一数组元素的指针,那么指针比较是合法的,因为否则我们不能确定它们在内存中的位置; 尽管如此,假设我们有:

char arr[70];
char *p1 = &arr[0]
char *p2 = &arr[69]

我们不能确定p1 > p1 - 3p2 < p2 + 6,因为在本例中,地址将是连续的吗?我们肯定知道什么是第一,什么不是,对吧?

我做了各种测试,看起来是这样的,但我想确定一下.

推荐答案

不是的.它只在比较指向数组对象内的元素或数组对象末尾之后的元素的指针时才有效.但这里还有另一个问题.

正如上面定义的那样(p1指向arr的第一个元素,p2指向arr的最后一个元素),您可能认为try 取消引用p1 - 3p2 + 6会导致未定义的行为;但即使try 用using pointer arithmetic leads to undefined behavior构成地址p1 - 3p2 + 6,程序在try 此指针运算时也是无效的.您可以使用指针算法来形成位于数组对象内的地址,或数组对象末尾之后的地址.不能使用指针算法从指向数组元素的指针形成其他地址.

C++相关问答推荐

C/C++中的状态库

在C中使用动态内存分配找到最小的负数

Tiva TM4C123GXL的I2C通信

如何将字符串argv[]赋给C中的整型数组?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

ESP32在vTaskDelay上崩溃

进程已完成,退出代码为138 Clion

`#if`条件中是否允许`sizeof`?

如何在C++中处理按键

getline()从c中的外部函数传递指针时输出null

是否需要包括<;errno.h>;才能使用perror?

我的C函数起作用了,但我不确定为什么

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

错误:字符串在C中获得意外输出

解密Chrome加密密钥

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

一元运算符

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

使用共享变量同步多线程 C 中的函数

段错误try 访问静态字符串,但仅有时取决于构建环境