c-指针算术和malloc()/calloc()函数



有两件事我不明白,通常在使用malloc()/caloc(。因此,我做了一个代码示例,其中我使用malloc(),并且我不键入强制转换,指针算术仍然有效:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *p = malloc(8);
    *p++ = 30;
    *p = 40;
    printf("p points to address [%p] which holds a value of %d, p points to address [%p] which holds a value of %dn", p, *p++, p, *p--);
    return 0;
}

为什么?

关于指针算术,我的另一个问题是,我上面给你看的代码,我最初是这样写的:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *p = malloc(8);
    *p++ = 30;
    *p-- = 40;
    printf("p points to address [%p] which holds a value of %d, p points to address [%p] which holds a value of %dn", p, *p++, p, *p--);
    return 0;
}

请注意,差值是*p---=40。我使用了p——因为我想打印指针指向的正确地址,我假设在使用p++之后,我需要使用p——所以指针将指向值30的地址,但如果我添加p——并打印它,我注意到它打印了另一个值。所以这里有什么东西不适合我,它是怎么回事?此外,如果我删除了——然后打印,它像我预期的那样打印了30,然后打印了40,但地址保持不变,我预期它是以前的地址+4,但它的值还没有改变,这是怎么回事?

https://i.stack.imgur.com/A3t6K.jpg

指针算术取决于声明指针的类型。由于您的指针是int *,那么++--将按sizeof(int)递增和递减指针的(原始)值,以便您可以访问相邻的int值。

在C中,可以在不触发警告的情况下将void *分配给另一种类型的指针(如int *)(在C++中不是这样)。在这种情况下,强制转换是由编译器隐式执行的。

相关内容

  • 没有找到相关文章