有没有关于指针运算的好文章或解释(博客、示例)?想必观众是一群学习C和C++的Java程序员.

推荐答案

首先,binky视频可能会有所帮助.这是一段关于指针的精彩视频.关于算术,这里有一个例子:

int * pa = NULL;
int * pb = NULL;
pa += 1; // pa++. behind the scenes, add sizeof(int) bytes
assert((pa - pb) == 1);

print_out(pa); // possibly outputs 0x4
print_out(pb); // possibly outputs 0x0 (if NULL is actually bit-wise 0x0)

(请注意,严格递增包含空指针值的指针是未定义的行为.我们使用NULL,因为我们只对指针的值感兴趣.通常,仅在指向数组元素时使用递增/递减).

下面显示了两个重要的概念

  • 将整数与指针相加/相减意味着将指针向前/向后移动N个元素.所以,如果一个int是4字节大,那么pa在我们的平台上增加1后可能包含0x4.
  • 用另一个指针减go 一个指针意味着得到它们的距离,用元素来衡量.所以从pa中减go pb将得到1,因为它们有一个元素距离.

以一个实际例子为例.假设您编写了一个函数,人们为您提供了一个开始和结束指针(在C++中非常常见):

void mutate_them(int *begin, int *end) {
    // get the amount of elements
    ptrdiff_t n = end - begin;
    // allocate space for n elements to do something...
    // then iterate. increment begin until it hits end
    while(begin != end) {
        // do something
        begin++;
    }
}

ptrdiff_t是(结束-开始)的类型.对于某些编译器,它可能是"int"的同义词,但对于另一个编译器,它可能是另一种类型.我们不知道,所以我们 Select 通用的typedef ptrdiff_t.

C++相关问答推荐

%p与char* 等组合缺少的GCC Wform警告

为什么这个C程序代码会产生以下结果?

如何解决C中的严格别名?

Tiva TM4C123GXL的I2C通信

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

C:fopen是如何实现二进制模式和文本模式的?

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

将fget()与strcMP()一起使用不是正确的比较

在每种If-Else情况下执行语句的最佳方式

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

C指针概念分段故障

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

Wcstok导致分段故障

链接器脚本和C程序使用相同的头文件,这可能吗?

在Ubuntu上使用库部署C程序的最佳实践

Matlab/Octave对conv2函数使用哪种方法?

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

clion.我无法理解 Clion 中发生的 scanf 错误

子进程不会修改父进程中的统计信息

K&R 练习 1-24