pointer-arithmetic相关内容
如何以单字节精度便携地执行指针运算? 请记住: char 在所有平台上都不是 1 字节 sizeof(void) == 1 仅在 GCC 中作为扩展提供 虽然某些平台可能有指针 deref 指针对齐限制,但算术可能仍需要比最小基本 POD 类型的大小更精细的粒度 解决方案 您的假设是有缺陷的 - sizeof(char) 被定义 为 1. 来自 C99 标准 (TC3
..
我有这段代码.它似乎在这里取消引用一个空指针,但随后将结果与 unsigned int 进行按位与运算.我真的不明白整个部分.它的目的是什么?这是指针算术的一种形式吗? struct hi{长一;国际b;长 c;};int main(){结构嗨 ob={3,4,5};struct hi *ptr=&ob;int num= (unsigned int) &(((struct hi *)0)->b)
..
在 Visual Studio C++ 版本 9(可能还有其他版本)中,以下代码: int a = sizeof(void);void const *b = static_cast("hello world");b += 6; 生成这些 错误: error C2070: 'void': 非法的操作数大小错误 C2036:“const void *":未知大小 此代码在 GCC 下工作,它处
..
C++ 标准 [sec 5.7] 说: 如果指针操作数和结果都指向同一个数组对象的元素,或者一个过去数组对象的最后一个元素,求值不应产生溢出;否则,行为是未定义. 那么,我是否正确地假设数组以外的其他类型的指针未定义? 例如: int a = 0;向量v(&a, (&a)+1); 上面的代码片段编译并运行得很好(使用 g++),但它有效吗? 解决方案 不,这是合法的.
..
如果我做*ptr[x],是不是等价于*(ptr[x]),或者(*ptr)[x]? 解决方案 *(ptr[x]) 请参阅维基百科运算符优先级表,或者,更详细的表,此 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
..
我已经看到在 OpenGL VBO 实现中使用了以下宏: #define BUFFER_OFFSET(i) ((char *)NULL + (i))//...glNormalPointer(GL_FLOAT, 32, BUFFER_OFFSET(x)); 您能否详细介绍一下这个宏的工作原理?可以用函数代替吗?更确切地说,增加一个 NULL 指针的结果是什么? 解决方案 让我们回顾 Op
..
考虑以下代码片段: 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 中变大. 但是第二个打印确实让我
..
我在 Pointer Arithmetic 中读了一点,我发现了两件事我不明白,也不知道它的用途 address_expression - address_expression 还有 address_expression >地址表达式 谁能给我解释一下,它们是如何工作的以及何时使用. 编辑: 我想说的是如果我只取两个地址并减去它们会产生什么 如果我取两个地址并比较它们是什
..
当一个指向特定类型(比如 int, char, float, ..)的指针增加时,它的值增加该数据类型的大小.如果指向x 大小数据的void 指针递增,它如何指向x 字节前面?编译器如何知道将 x 添加到指针的值? 解决方案 最终结论:void* 上的算术在 C 和 C++ 中都是非法. GCC 允许它作为扩展,参见 算术上void- 和函数指针(注意本节是手册“C 扩展"一章的一部
..
在符合 AMD64 的架构上,地址在取消引用之前需要采用规范形式. 来自 英特尔手册,第 3.3.7.1 节: 在 64 位模式下,一个地址被认为是规范形式的,如果地址位 63 到最高有效位由微体系结构设置为全 1 或全 0. 现在,当前操作系统和架构上实现的最重要的位是第 47 位.这给我们留下了一个 48 位的地址空间. 特别是当 ASLR 启用时,用户程序可能会收到第
..
我一直在读到,在 C 中,使用指针算术通常比使用下标访问数组更快.即使使用现代(据称是优化的)编译器也是如此吗? 如果是这样,当我开始从学习 C 转向 Objective-C 和 解决方案 您需要了解此声明背后的原因.你有没有问过自己为什么它更快?让我们比较一些代码: int i;int a[20];//将所有值初始化为零memset(a, 0, sizeof(a));for (i =
..
通过一些 C 面试问题,我发现了一个问题,说明“如何在不使用 sizeof 运算符的情况下在 C 中找到数组的大小?",有以下解决方案.它有效,但我不明白为什么. #include int main() {int a[] = {100, 200, 300, 400, 500};整数大小 = 0;大小 = *(&a + 1) - a;printf("%d\n", 大小);返回0;} 正如预期的那
..
(自我回答的问答 - 这个问题不断出现) 我假设读者知道指针算法的工作原理. int arr[3] = {1,2,3};int* ptr = arr;...*(ptr + i) = 值; 老师/C 书籍一直告诉我我不应该像上面的例子那样使用 *(ptr + i),因为“指针支持数组样式索引"我应该使用 ptr[i] = value; 代替.没有争论 - 更容易阅读. 但是查看 C
..
正如 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)
..
LEA 指令是否支持负位移? mov rax, 1lea rsi, [rsp - rax] 当我在 asm 文件中使用上述代码时,出现错误: $ nasm -f macho64 test.asm$ 错误:无效的有效地址 我知道我们可以在 C 中做这样的指针运算: void foo(char *a, size_t b) {*(a - b) = 1;} 然后我假设: lea rsi, [
..
如果我有一个像这样的简单张量类 struct 张量{双 XX、XY、XZ;双 YX, YY, YZ;双ZX、ZY、ZZ;} 使用指针算术(见下文)访问其元素是否是未定义的行为? double&Tensor::operator[](int i){断言(i 解决方案 是的,这是未定义的行为. 数据成员不在数组中,因此不能保证在连续内存中背靠背存储,因为指针运算需要.它们之间可能会产
..
在下面的程序中,如果我给空指针加 1,它将向前移动一个字节.但是,正如预期的那样,它分别为 int 和 double 移动了 4 个和 8 个字节 指针.为什么空指针移动 1 个字节,就像字符指针一样? #includeint main(void){int num=3,*int_ptr=#double sum=3,*double_ptr=∑void *void_ptr1=&num
..
我试图在内存中找到两个变量之间的距离.具体来说,我需要找到 char[] 数组和 int 之间的距离. 字符数据[5];int a = 0;printf("%p\n%p\n", &data[5], &a);long int distance = &a - &data[5];printf("%ld\n", 距离); 当我在没有最后两行的情况下运行我的程序时,我得到了两个变量的正确内存地址,如下
..
我知道指针算法不允许用于空指针.但想象一下我有这样的事情: class MyArray {int *arrayBegin;//指向第一个数组项的指针,NULL 表示空数组无符号数组大小;//数组的大小,空数组为零上市:int *begin() const { return arrayBegin;}int *end() const { return arrayBegin + arraySize;}
..