-2

刚刚回到 uni 的 C++ 编程,并想起了为什么我认为指针业务如此疯狂。谁能给我一个关于这里发生的事情的快速解释?是否可以在 main 函数中获取 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

4 回答 4

4

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

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

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

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

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

于 2013-10-06T16:03:59.753 回答
3

不编译 - 为什么不是 20?

它不能编译,因为a它既不是数组也不是指针。下标整数时您期望什么语义?这没有任何意义。

除此之外:即使你使用(&a)[1](它确实编译),它也不会有任何好处——地址上什么都没有,&a + 1因为a是一个 single ,而不是两个sint的数组。int所以你的程序会调用未定义的行为。

于 2013-10-06T16:03:24.970 回答
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]),这会产生未定义的行为

于 2013-10-06T16:06:34.403 回答
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;
}
于 2013-10-06T16:06:40.327 回答