C指针算术问题

时间:2011-08-15 16:53:26

标签: c math pointers

我有一点点指针算术和一般指针,我把这个代码拉到了一起。

#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 =&amp; i0;'的情况下让ptr指向i0使用指针算术?另外,我如何正确地为字符和整数打印出来(char的一个方法和int的一个方法)。

提前致谢。 ;)

8 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

使用指针算法无法使ptr指向i0。指针算法仅在单个数组对象的范围内工作(非数组变量被视为大小为1的数组)。您不能使用指针算法使指针从一个独立对象跳到另一个对象。

答案 2 :(得分:1)

您的代码没有意义。您无法保证a,i0,b,i1,c和i2在创建时在内存中的定义 - 因此您无法使用指针算法从(ptr =&amp; a)的地址移动到I0。

如果你想让ptr等于i0的位置你可以做ptr =&amp; i0。如果i0是一个整数(它是)它将是4个字节大,所以如果你的指针是void / char,你可以使用指针算法一次移动整数1 btye。

答案 3 :(得分:1)

你不能这样做。

指针算法适用于指向数组元素的指针,您可以对指向数组内元素的指针进行算术运算,以调整指向同一数组中另一个元素的指针。

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

答案 4 :(得分:1)

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

#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;
}

答案 5 :(得分:0)

在此代码示例中,未执行

ptr=&i0;

您无法让ptr指向i0 便携式,因为, i0只是一个本地变量&amp;它的地址不存储在任何其他变量中。

答案 6 :(得分:0)

我唯一能想到的是:

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

但不确定它是否有效且与ptr = &i0无差别

正如其他人指出的那样,根据标准,你只能在单个对象的边界内进行指针运算,比如结构或数组,所以上面的代码即使它可能有用也不是真的正确

答案 7 :(得分:0)

你必须做这样的事情:

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);
}

不完全是你写的但可以工作。