Tag: 指针算术

指针算术输出错误

在下面的程序中,Here ptr已被声明为指向整数指针的指针,并分配了数组p[]的基址,该数组已被声明为整数指针数组。 假设ptr在ptr递增之前包含地址9016 (假设p的起始地址是9016),并且在ptr++ ,它将包含值9020(假设int占用4个字节)。 所以ptr-p应该输出为4即(9020-9016 = 4)。 但它输出为1。 为什么? #include int main() { static int a[]={0,1,2,3,4}; static int *p[]={a,a+1,a+2,a+3,a+4}; int **ptr=p; ptr++; printf(“%d”,ptr-p); return 0; }

为什么在offsetof()中减去空指针?

Linux的stddef.h将offsetof()定义为: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 而关于offsetof() ( http://en.wikipedia.org/wiki/Offsetof )的维基百科文章将其定义为: #define offsetof(st, m) \ ((size_t) ( (char *)&((st *)(0))->m – (char *)0 )) 为什么在维基百科版本中减去(char *)0 ? 有什么情况会真正有所作为吗?

为什么我和C中的arr 一样有更大的数据类型?

众所周知,如果你在C中以arr[i]访问数组元素,你也可以像i[arr]一样访问元素,因为这些只是归结为*(arr + i)并且加法是可交换的。 我的问题是为什么这适用于大于char数据类型,因为sizeof(char)是1,对我来说这应该只需要一个char来推进指针。 也许这个例子让它更清晰: #include #include struct large { char data[1024]; }; int main( int argc, char * argv[] ) { struct large arr[4]; memset( arr, 0, sizeof( arr ) ); printf( “%lu\n”, sizeof( arr ) ); // prints 4096 strcpy( arr[0].data, “should not be accessed (and is not)” ); strcpy( arr[1].data, “Hello world!” […]

限制指针算术或比较的基本原理是什么?

在C / C ++中,仅当结果指针位于原始指向的完整对象内时,才定义指针的加法或减法 。 此外,只有当两个指向对象是唯一完整对象的子对象时,才能执行两个指针的比较 。 这种限制的原因是什么? 我认为分段内存模型(参见此处 §1.2.1)可能是其中一个原因,但由于编译器实际上可以定义所有指针的总顺序,如此答案所示 ,我对此表示怀疑。

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

如何以单字节精度可移植地执行指针运算? 请记住: char在所有平台上都不是1个字节 sizeof(void) == 1仅作为GCC中的扩展名提供 虽然某些平台可能具有指针deref指针对齐限制,但算术仍可能需要比最小基本POD类型的大小更精细的粒度

C指针算术

鉴于此代码: int *p, *q; p = (int *) 1000; q = (int *) 2000; 什么是q – p以及如何?

C中取消引用和括号引用的操作顺序

如果我做*ptr[x] ,那相当于*(ptr[x]) ,还是(*ptr)[x] ?

访问元素超出C中数组的末尾

我一直在阅读K&R关于C的书,发现C中的指针算法允许访问超出数组末尾的一个元素。 我知道C允许用记忆做几乎任何事情,但我只是不明白,这种特性的目的是什么?

void时指针算法未知大小

在Visual Studio C ++版本9(也可能是其他版本)中,代码如下: int a = sizeof(void); void const *b = static_cast(“hello world”); b += 6; 生成这些 错误 : error C2070: ‘void’: illegal sizeof operand error C2036: ‘const void *’ : unknown size 此代码在GCC下工作,它将sizeof(void)视为1 。 有没有办法绕过这个限制,因为为了指针运算而显式地转换为char *会增加混淆( void *被很好地识别并用作指向原始内存的无类型指针)。 Update0 请注意,我很清楚标准的存在。 我想做原始指针算术。 我把sizeof(void)表示我很清楚它不是1的原因是问题的原因。 代码示例仅用于演示生成错误所需的内容。 我知道这不是使用void的“正常”方式,但这是C,这些事情发生了。 是的,人们需要在低级别这样做。 我不是在追求原因,我是在追求如何。 如果你想知道原因,请查看一些内核源代码或友好的glibc。 UPDATE1 看来这个问题引起了很大的混乱。 问题不在于为什么 sizeof(void) == 1不是标准的,而是什么时候不做。 […]

指针/地址差异

为什么两个地址之间的区别是错误的? http://codepad.org/NGDqFWjJ #include int 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); return 0; } 输出: -1083846364 -1083846368 1