有没有关于指针运算的好文章或解释(博客、示例)?想必观众是一群学习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.
  • 用另一个指针减去一个指针意味着得到它们的距离,用元素来衡量.所以从pa中减去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"的同义词,但对于另一个编译器,它可能是另一种类型.我们不知道,所以我们选择通用的typedef ptrdiff_t.

C++相关问答推荐

当线程在已解锁的互斥锁上调用 pthread_mutex_unlock 时会发生什么

“C”中函数内部的数据操作

如何检测非 IEEE-754 浮点数,以及如何使用它们?

HAL_UART_Transmit_IT 如何在 STM32F091VB 上管理串行发送数据

在数组中查找与数组均值相同的对

C中指向结构的指针与指向数组的指针

如何在数组中打印二进制数?

如何使用带有 typedef 的注册存储类?

如何解读一个单词并在 C 的 txt 文件中找到它的所有匹配项?

16 位 x86 MS-DOS 实模式下的分段远指针分配

编译后的C代码对R'给出了不同的结果;他在用deSolve

是否允许 C 编译器合并对 volatile 变量的顺序赋值?

假设指向同一个变量的两个指针是非法的/UB,为什么 C 编译器不能优化更改 const 指针的值?

是否使用 if (0) 跳过应该工作的switch 中的一个 case ?

为什么快速整数类型比其他整数类型快?

在 C/C++ 中获得正模的最快方法

这段代码如何在不使用 sizeof() 的情况下确定数组大小?

在 C++ 中,我是否为我不吃的东西买单?

C 与 C++ 编译不兼容 - 未命名类型

为什么 c = ++(a+b) 会出现编译错误?