需要简单的指针数组平等解释

时间:2013-10-06 16:00:15

标签: c++ c pointers

回到uni的一些C ++编程,并记住为什么我认为这个指针业务是如此疯狂。有人能给我一个快速的解释,说明这里发生了什么?是否可以在主函数中获得int 20?

#include <stdio.h>

void test(int *b)
{
    b[0] = 10;
    b[1] = 20;
    printf("\n %i \n ", b[1]); // prints 20
}

int main( int argc, char* argv[] )
{
    int a;
    test(&a);
    printf("%i \n", a);    //prints 10
    // printf("%i \n", a[1]);    // doesn't compile - why not 20?
    return 0;
}

编辑:对不起,我的简单问题是一些用户处理的负担,并感谢那些真正认真对待并告知我未定义行为的用户。我问这个问题的原因是感谢一个代码,我发现我无法弄清楚如何使用。我不只是把它拉出来。在这里,如果有人有兴趣。看看glhUnProjectf函数和最后一个参数我打算如何使用它。
http://www.opengl.org/wiki/GluProject_and_gluUnProject_code

4 个答案:

答案 0 :(得分:4)

老实说,我有点惊讶它让你为b [1]分配一个值。我猜想如果你拿出了不编译的部分,当你尝试将20分配给b [1]时,你会得到一个段错误,因为你的程序还没有在内存中分配那个空间。无论如何,int a不是指针,它是一个变量,所以它不能像数组一样被索引。

回顾一下,这里是你所拥有的变量和指针的细分:

int a - a是内存中的整数变量,但是你的程序只关心整数的值,而不是它在内存中的实际值。

&amp; a - 返回指向内存中整数a的指针。因为指向数组的指针也只是指向数组中第一个元素的指针,所以当你尝试索引它时程序不会抱怨

int * b - 就像a,这是一个指向整数的指针,而不是整数本身。如上所述,指针可以像数组([0],[1]等)索引,因为指向数组的指针实际上是指向数组中第一个元素的指针。如前所述,尝试索引已经分配的内存空间,无论你是否真的有一个数组要索引,都是未定义的行为(大多数情况下它会给你一个分段错误,但它也可能返回恰好在该位置的内存中的值,可能几乎是任何东西,它甚至不能保证是相同的数据类型)。

答案 1 :(得分:3)

  

不编译 - 为什么不编译?

它不会编译,因为a既不是数组也不是指针。在订阅整数时,您期望什么语义?它没有意义。

除此之外:即使您使用(&a)[1]执行编译),它也不会有任何好处 - 地址&a + 1上没有任何内容,因为{ {1}}是一个a,而不是两个int的数组。所以你的程序会调用未定义的行为。

答案 2 :(得分:0)

int a;
test(&a);

int变量分配内存,使其未初始化并将其地址传递给函数test

void test(int *b)
{
    b[0] = 10;
    b[1] = 20;
    printf("\n %i \n ",b[1]);    // prints 20
}

首先将此变量初始化为10,然后尝试访问内存中的int(使用b[1]访问数组越界),这会产生一个 未定义的行为

答案 3 :(得分:0)

#include <stdio.h>

void test(int *b) // A function that takes a pointer to an int as an input
{
    b[0] = 10; // The value pointed to by b now equals 10 (value of a).
    b[1] = 20; // Not valid. memory at b[1] has not been allocated yet.
    printf("\n %i \n ",b[1]);  
}

int main( int argc, char* argv[] )
{
    int a; 
    test(&a); // call test giving address of a (pointer to a as input)
    printf("%i \n",a);    //prints 10, this is because the value pointed by b is 10.
    //printf("%i \n",a[1]);    //doesn't compile - a is not a pointer!
    return 0;
}