pointer-arithmetic相关内容

当 sizeof(char) != 1 时 C 中的字节精度指针算术

如何以单字节精度便携地执行指针运算? 请记住: char 在所有平台上都不是 1 字节 sizeof(void) == 1 仅在 GCC 中作为扩展提供 虽然某些平台可能有指针 deref 指针对齐限制,但算术可能仍需要比最小基本 POD 类型的大小更精细的粒度 解决方案 您的假设是有缺陷的 - sizeof(char) 被定义 为 1. 来自 C99 标准 (TC3 ..

C 中明显的 NULL 指针取消引用实际上是指针算术吗?

我有这段代码.它似乎在这里取消引用一个空指针,但随后将结果与 unsigned int 进行按位与运算.我真的不明白整个部分.它的目的是什么?这是指针算术的一种形式吗? struct hi{长一;国际b;长 c;};int main(){结构嗨 ob={3,4,5};struct hi *ptr=&ob;int num= (unsigned int) &(((struct hi *)0)->b) ..
发布时间:2021-12-23 17:22:26 其他开发

是“一过即尽"吗?非数组类型的指针是 C++ 中的有效概念吗?

C++ 标准 [sec 5.7] 说: 如果指针操作数和结果都指向同一个数组对象的元素,或者一个过去数组对象的最后一个元素,求值不应产生溢出;否则,行为是未定义. 那么,我是否正确地假设数组以外的其他类型的指针未定义? 例如: int a = 0;向量v(&a, (&a)+1); 上面的代码片段编译并运行得很好(使用 g++),但它有效吗? 解决方案 不,这是合法的. ..
发布时间:2021-12-13 13:22:35 C/C++开发

指针/地址差异

为什么两个地址的区别是错误的?http://codepad.org/NGDqFWjJ #includeint main(){int i = 10, j = 20;int *p = &i;int *q = &j;int c = p - q;printf("%d\n", p);printf("%d\n", q);printf("%d", c);返回0;} 输出: -1083846364-1083 ..
发布时间:2021-12-13 13:17:54 其他开发

NULL + int 的结果是什么?

我已经看到在 OpenGL VBO 实现中使用了以下宏: #define BUFFER_OFFSET(i) ((char *)NULL + (i))//...glNormalPointer(GL_FLOAT, 32, BUFFER_OFFSET(x)); 您能否详细介绍一下这个宏的工作原理?可以用函数代替吗?更确切地说,增加一个 NULL 指针的结果是什么? 解决方案 让我们回顾 Op ..
发布时间:2021-12-13 13:03:57 其他开发

C中的指针算术

考虑以下代码片段: int (*p)[3];int (*q)[3];q = p;q++;printf("%d, %d\n", q, p);printf("%d\n", q-p); 我知道指针算术是智能的,这意味着操作 q++ 提前 q 足够的字节指向下一个 3 整数数组,所以它不会令我惊讶的是,第一次打印是 '12, 0' 这意味着增加 q 使其在 12 中变大. 但是第二个打印确实让我 ..
发布时间:2021-12-13 12:52:43 其他开发

C/C++:指针算术

我在 Pointer Arithmetic 中读了一点,我发现了两件事我不明白,也不知道它的用途 address_expression - address_expression 还有 address_expression >地址表达式 谁能给我解释一下,它们是如何工作的以及何时使用. 编辑: 我想说的是如果我只取两个地址并减去它们会产生什么 如果我取两个地址并比较它们是什 ..
发布时间:2021-12-02 08:25:15 C/C++开发

C中void指针的指针算法

当一个指向特定类型(比如 int, char, float, ..)的指针增加时,它的值增加该数据类型的大小.如果指向x 大小数据的void 指针递增,它如何指向x 字节前面?编译器如何知道将 x 添加到指针的值? 解决方案 最终结论:void* 上的算术在 C 和 C++ 中都是非法. GCC 允许它作为扩展,参见 算术上void- 和函数指针(注意本节是手册“C 扩展"一章的一部 ..
发布时间:2021-12-01 23:51:40 其他开发

地址规范形式和指针算法

在符合 AMD64 的架构上,地址在取消引用之前需要采用规范形式. 来自 英特尔手册,第 3.3.7.1 节: 在 64 位模式下,一个地址被认为是规范形式的,如果地址位 63 到最高有效位由微体系结构设置为全 1 或全 0. 现在,当前操作系统和架构上实现的最重要的位是第 47 位.这给我们留下了一个 48 位的地址空间. 特别是当 ASLR 启用时,用户程序可能会收到第 ..

通过指针运算与 C 中的下标访问数组值

我一直在读到,在 C 中,使用指针算术通常比使用下标访问数组更快.即使使用现代(据称是优化的)编译器也是如此吗? 如果是这样,当我开始从学习 C 转向 Objective-C 和 解决方案 您需要了解此声明背后的原因.你有没有问过自己为什么它更快?让我们比较一些代码: int i;int a[20];//将所有值初始化为零memset(a, 0, sizeof(a));for (i = ..
发布时间:2021-11-18 03:56:04 移动开发

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

通过一些 C 面试问题,我发现了一个问题,说明“如何在不使用 sizeof 运算符的情况下在 C 中找到数组的大小?",有以下解决方案.它有效,但我不明白为什么. #include int main() {int a[] = {100, 200, 300, 400, 500};整数大小 = 0;大小 = *(&a + 1) - a;printf("%d\n", 大小);返回0;} 正如预期的那 ..
发布时间:2021-11-18 03:54:26 其他开发

指针是否支持“数组样式索引"?

(自我回答的问答 - 这个问题不断出现) 我假设读者知道指针算法的工作原理. int arr[3] = {1,2,3};int* ptr = arr;...*(ptr + i) = 值; 老师/C 书籍一直告诉我我不应该像上面的例子那样使用 *(ptr + i),因为“指针支持数组样式索引"我应该使用 ptr[i] = value; 代替.没有争论 - 更容易阅读. 但是查看 C ..

对于数组,为什么会出现 a[5] == 5[a]?

正如 Joel 在 Stack Overflow 播客 #34 中指出的那样,C 编程语言(又名:K & R),有提到这个C 中数组的属性:a[5] == 5[a] Joel 说是因为指针运算,但我还是不明白.为什么a[5] == 5[a]? 解决方案 C 标准定义了 [] 操作符如下: a[b] == *(a + b) 因此 a[5] 将评估为: *(a + 5) ..
发布时间:2021-11-18 00:51:29 其他开发

通过指针算法访问结构数据成员

如果我有一个像这样的简单张量类 struct 张量{双 XX、XY、XZ;双 YX, YY, YZ;双ZX、ZY、ZZ;} 使用指针算术(见下文)访问其元素是否是未定义的行为? double&Tensor::operator[](int i){断言(i 解决方案 是的,这是未定义的行为. 数据成员不在数组中,因此不能保证在连续内存中背靠背存储,因为指针运算需要.它们之间可能会产 ..
发布时间:2021-09-13 20:39:13 C/C++开发

为什么将 void 指针增加 1 会向前移动 1 个字节,但对于整数指针则是 4 个字节,对于 double 则是 8 个字节?

在下面的程序中,如果我给空指针加 1,它将向前移动一个字节.但是,正如预期的那样,它分别为 int 和 double 移动了 4 个和 8 个字节 指针.为什么空指针移动 1 个字节,就像字符指针一样? #includeint main(void){int num=3,*int_ptr=#double sum=3,*double_ptr=∑void *void_ptr1=&num ..
发布时间:2021-06-18 19:57:14 其他开发

不同类型指针之间的减法

我试图在内存中找到两个变量之间的距离.具体来说,我需要找到 char[] 数组和 int 之间的距离. 字符数据[5];int a = 0;printf("%p\n%p\n", &data[5], &a);long int distance = &a - &data[5];printf("%ld\n", 距离); 当我在没有最后两行的情况下运行我的程序时,我得到了两个变量的正确内存地址,如下 ..
发布时间:2021-06-18 19:55:41 其他开发

是否允许向空指针添加零?

我知道指针算法不允许用于空指针.但想象一下我有这样的事情: class MyArray {int *arrayBegin;//指向第一个数组项的指针,NULL 表示空数组无符号数组大小;//数组的大小,空数组为零上市:int *begin() const { return arrayBegin;}int *end() const { return arrayBegin + arraySize;} ..
发布时间:2021-06-10 18:40:48 C/C++开发