我有几个问题。这不是功课。我只想更好地理解。
所以,如果我有
int * b = &k;
然后k
必须是整数,b
是指向k
在内存中的位置的指针,对吗?
b
的基础“数据类型”是什么?当我输出它时,它返回0x22fe4c
之类的东西,我假设它是十六进制的内存位置2293324
,对吗?
记忆位置'2293324'究竟在哪里? “堆”?如何输出值,例如,记忆位置0
,1
,2
等?
如果输出*b
,则与直接输出k
相同,因为*
以某种方式表示b
指向的值。但这似乎与声明为b
的{{1}}声明不同,因此,如果int * b = k
表示“价值”,那么并不意味着“声明*
值b
?我知道它没有,但我仍然想要明白这意味着什么是语言明智。
如果我输出k
,这实际上是返回指针本身的地址,与&b
无关,是吗?
我也可以k
执行与int & a = k;
相同的操作。通常没有必要以这种方式使用int a = k;
吗?
答案 0 :(得分:2)
1-是。
2-没有“基础数据类型”。它是指向int的指针。这就是它的本质。对于c / c ++,它的数据类型为“int”或“char”。
3-您甚至不应该尝试输出未分配的内存值。那是一个分段错误。你可以尝试做b--(这使得“b”在实际位置之前指向“int”。至少,你的程序认为它是一个int。)
带指针的4- *是一个操作符。对于任何数据类型,它是另一种数据类型。这就像=符号。当你输入=时它有一个含义而当你输出=时有另一个含义。符号与其含义并不相关。5-& b是b的方向。它与k有关,而b与k有关。例如,如果你这样做(**(& b)),你将使用b方向指向的值指向该值。哪个是k。如果你没有改变它,当然。
6- int & a = k
表示将a的方向设置为k的方向。无论如何,a
将是k。如果你做a = 1,则k将为1.它们都是对同一事物的引用。
当然可以更正。这就是我理解的方式。
答案 1 :(得分:2)
回答您的问题:
是的,b
是pointer
到k
:它包含堆中k
的地址,但不包含k
的值}本身。
"数据类型" b
的{{1}}是int
:基本上,这告诉我们b
点的地址是int
的地址,但这与{{b
无关。 1}}本身:b
只是变量的地址。
不要尝试手动将内存分配给特定的地址:内存根据初始化后的对象大小进行分配,因此内存地址间隔开,以便为每个对象分配对象留出空间其他在记忆中,因此手动改变这是一个坏主意。
*
在这种情况下,取消对b
的引用。正如我所说,b
是一个记忆地址,但*b
是 b
地址的。在这种情况下,它是k
,因此操纵*b
与操纵k
相同。
正确,&b
是指针的地址,与k
和b
本身不同。
使用int & a = k
正在为k
创建引用,可以将其用作k
本身。这种情况很简单,但是,对于需要改变函数本身范围之外的变量值的函数,引用是理想的。
例如:
void addThree(int& a) {
a += 3;
}
int main() {
int a = 3; //'a' has a value of 3
addThree(a); //adds three to 'a'
a += 2; //'a' now has a value of 8
return 0;
}
在上述情况下,addThree
会引用a
,这意味着int a
中main()
的值会被函数直接操纵。
这也适用于指针:
void addThree(int* a) { //Takes a pointer to an integer
*a += 3; //Adds 3 to the int found at the pointer's address
}
int main() {
int a = 3; //'a' has a value of 3
addThree(&a); //Passes the address of 'a' to the addThree function
a += 2; //'a' now has a value of 8
return 0;
}
但不,带有复制构造的参数:
void addThree(int a) {
a += 3; //A new variable 'a' now a has value of 6.
}
int main() {
int a = 3; //'a' has a value of 3
addThree(a); //'a' still has a value of 3: The function won't change it
a += 2; //a now has a value of 5
return 0;
}
答案 2 :(得分:1)
彼此称赞。 *
要么声明指针,要么取消引用它。 &
要么声明一个(左值)引用,要么取一个对象或内置类型的地址。因此,在许多情况下,它们协同工作。要创建对象的指针,您需要其地址。要将指针用作值,请取消引用它。
答案 3 :(得分:1)
3 - 如果k是局部变量,它就在堆栈上。如果k是静态变量,则它在程序的数据部分中。这同样适用于任何变量,包括b。如果使用new,malloc(),calloc(),...,则指针将指向堆中的某个位置。如果使用alloca()(或_alloca()),指针将指向堆栈(alloca()类似于使用局部变量长度数组)。
涉及数组的示例:
int array_of_5_integers[5];
int *ptr_to_int;
int (*ptr_to_array_of_5_integers)[5];
ptr_to_int = array_of_5_integers;
ptr_to_array_of_5_integers = &array_of_5_integers;