c - c程序的程序输出

标签 c arrays pointers

请解释下面提到的程序的输出。我认为输出应该是 1 但它不是 1

#include <stdio.h>

int main()
{
    int  a[] = {1, 2, 3, 4, 5, 6};
    int *ptr = (int*)(&a+1);

    printf("%d ", *(ptr-1));
    getchar(); 

    return 0;
} 

最佳答案

这是因为 &a 的类型是 int(*)[6] 因此 &a + 1 != &a[0] + 1是你的意思,给定你的预期输出。

如果打印地址 &a&a[0],它们将相同,但是递增 &a 与递增 &a[0] 因为 sizeof(int) != sizeof(int *),虽然这并不总是正确的,但您的代码不应该假设它是,或者依赖于它.

此外,您似乎正在使用强制转换,因为您的编译器提示 &a 是不兼容的指针类型,如果指针是兼容的类型,则不需要强制转换所以

#include <stdio.h>

int main()
{
    int  a[] = {1, 2, 3, 4, 5, 6};
    int *ptr = &a[0] + 1;

    printf("%d\n", *(ptr-1));

    return 0;
}

应该只编译 find,输出将是 1,如您所料。

关于c - c程序的程序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29659099/

相关文章:

c - 指向结构指针成员的指针

c++ - 更改浮点舍入模式

arrays - 尝试访问数组时不断出现访问冲突

c++ - 在 C++ 中保存来自二维数组的灰度图像

c - c 中多维数组的指针

c++ - 为什么这个代码片段有效?如何取消引用 nullptr?

c - LinkedList 两次读取根的值

给定键列表获取数组值的 PHP 内置方法

c - 使用指针将二维数组传递给 C 中的函数

c - c中的unicode字符串操作