回到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
答案 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;
}