繁体   English   中英

C 指针算术问题

[英]C Pointer Arithmetic Problems

我对指针算术和一般的指针有点摆弄,我把这段代码放在一起。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

int main(int argc,char **argv){
    void *ptr=NULL;
    char a='a';
    int i0=0;
    char b='b';
    int i1=1;
    char c='c';
    int i2=2;
    ptr=&a;
    //What do I do here to get to i0?
    printf("%d",(int*)ptr); //and to print it out?
    while(1);
    return 0;
}

我的问题正是我在评论中提出的。 如何让 ptr 指向 i0 而无需执行 'ptr=&i0;' 使用指针算术? 另外,我如何正确打印字符和整数(一种用于 char 的方法和一种用于 int 的方法)。

提前致谢。 ;)

获取指向i0位置的指针的唯一方法是& i0

虽然某些编译器可能会对齐i0以便* ((int*) (((char*) ptr) - 1))可用于访问i0 ,但这并不能保证。 编译器经常对局部变量重新排序,甚至可能根本不将它们存储在 memory 中。

您不能使用指针算术让ptr指向i0 指针运算仅在单个数组 object 的范围内有效(非数组变量被视为大小为 1 的 arrays)。 您不能使用指针算法使指针从一个独立的 object 跳到另一个。

你的代码没有意义。 您无法保证 a、i0、b、i1、c 和 i2 在创建时在 memory 中定义的位置 - 因此您不能使用指针运算从 a (ptr=&a) 的地址移动到 i0。

如果你想让 ptr 等于 i0 的位置,你可以做 ptr = &i0. 如果 i0 是 integer (它是),它将是 4 个字节大,因此如果您的指针是 void/char,您可以使用指针算法在 integer 一次移动 1 个字节。

你不能这样做。

指针运算适用于指向数组元素的指针,也就是说,您可以对指向数组中某个元素的指针进行运算,以调整指向同一数组中另一个元素的指针。

您不能对指向变量的指针进行指针运算并使其指向另一个不相关的变量。

您只能在整个 object(如数组)中进行指针运算。 这有效:

#include <stdio.h>
int main(void) {
    int arr[100];
    int *ptr;
    arr[42] = 42;
    ptr = arr; /* ptr points to the 1st element */
    printf("%d\n", *(ptr + 42)); /* contents of the 43rd element */
    return 0;
}

在这个代码示例中,没有做

ptr=&i0;

您不能让ptr可移植地指向i0因为,
i0只是一个局部变量,它的地址不存储在任何其他变量中。

我唯一能想到的是:

ptr += ((char*)&i0 - &a)

但不确定它是否有效,它与ptr = &i0没有太大区别

正如其他人指出的那样,根据标准,您只能在单个 object 的范围内进行指针运算,例如结构或数组,因此即使上面的代码可能工作也不是真的正确

你必须做这样的事情:

int main(void)
{
    union u
    {
       char ch;
       int i;
    } arr[] = { { .ch = 'a' }, { .i = 0 }, { .ch = 'b' }, { .i = 1 } };

    union u *ptr = &arr[0];
    printf("%d\n", ptr[1].i);
}

不完全是你写的,但会工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM