我认为以下代码是正确的,但它无效。
int x, *ra;
&ra = x;
和
int x, ra;
&ra = x;
如果这两个代码段都正确,请帮助我。如果没有,你在他们身上看到了什么错误?
答案 0 :(得分:17)
你的两个表达都不正确,应该是:
int x, *ra;
ra = &x; // pointer variable assigning address of x
&
ampersand是运算符的地址(采用一元语法),使用&
您可以将变量x
的地址分配到pointer变量{ {1}}。
此外,正如您的问题标题所示:ra
。
Assigning int value to an address
是一个包含变量ra
地址的指针,因此您可以通过x
x
分配新值
ra
这里*ra = 20;
指针变量(在一元语法中)是deference operator在地址处给出值。
因为您还向c++标记了问题,所以我认为您对reference variable声明感到困惑,即:
*
因此,在引用变量的情况下,如果要为int x = 10;
int &ra = x; // reference at time of declaration
分配一个新值,它的语法非常简单,就像我们对值变量一样:
x
(请注意,即使ra = 20;
是我们分配给ra
而没有x
的参考变量,或者&
仍然有变化反映,这是参考变量的好处:简单易用作为指针!)
记住在声明时给出的引用绑定,它不能改变指针变量在程序中稍后指向新变量的位置。
在C中我们只有指针和值变量,而在C ++中我们有一个指针,引用和值变量。在我的链接答案中,我试图解释differences between pointer and reference variable。
答案 1 :(得分:5)
两者都不正确。
声明指针时,为其指定变量的地址。你正在尝试相反的方式。正确的方法是:
int x,*ra;
ra = &x;
答案 2 :(得分:5)
这两个原因,就像你在问题中的方式一样,是未定义的行为。
对于第一个,您不初始化指针,这意味着它指向一个随机位置(如果变量是全局的,则为NULL
。)
对于第二种情况,您尝试更改变量所在的地址,这是不允许的(如果它甚至会编译)。
答案 3 :(得分:2)
这是一些带注释的代码:
int main () {
// declare an int variable
int x = 0;
// declare a pointer to an int variable
int *p;
// get the memory address of `x`
// using the address-of operator
&x;
// let `p` point to `x` by assigning the address of `x` to `p`
p = &x;
// assign `x` a value directly
x = 42;
// assign `x` a value indirectly via `p`
// using the dereference operator
*p = 0;
// get the value of `x` directly
x;
// get the value of `x` indirectly via `p`
// using the dereference operator
*p;
}
请注意,不允许取消引用不指向指定类型的有效对象的指针。
所以你通常不应该做以下事情(除非你真的知道你在做什么):
*(int*)(12345) = 42; // assign an integer value to an arbitrary memory address
答案 4 :(得分:1)
这是我的2美分。
如果您要了解C中的指针。首先区分*
运算符和*
类型限定符/说明符。
请参阅C *
中的一个syntaxique元素,既可以同时扮演角色,又可以同时扮演角色。类型限定符:
int a;
int * c = &a;
int * my_function_returning_pointer();
获得正确的int。作为运营商。 (*c
是a
)的别名
*c = 9;
我承认这很混乱,可能会陷入很多初学者的困境。确保您在将*
用作运算符或将其用作类型限定符时识别。
同样的事情适用于&
,尽管它不常用作类型限定符。
int & f = returning_a_reference();
int my_function( int & refParam);
它更常用于获取对象的地址。因此,它被用作运营商。
c = &f;
答案 5 :(得分:0)
case 1:
int x,*ra;
&ra = x;
it is wrong in c, because in c we can point to a memory location by using a pointer ( i.e *ra in your case ). this can be done as fallows
int x, *ra; x ---------
ra=&x; ra --->1000 | value |
----------
NOTE : with out initializing a variable we can't use pointer to hold the address of that variable, so you better to first initialize variable, then set pointer to that memory location.
int x, *ra;
x=7;
ra=&x;
Fallowing may be helpful to you:
problems(mistake we do ) in handling pointers :
1.)
int a ,*p;
p=a; // assigning value instead of address. that leads to segmentation fault at run time.
2)
int a, *p;
&p=a; // look at here wrong assignment
3)
char *p="srinivas"
strcat(p, "helo" ) ; // we cant add a substring to the constant string.
4) int a=5, *p;
p=5; // the pointer here will points to location 5 in the memory, that may damage whole system, be care full in these type of assignments.