声明指针的方法
Ways to a declare a pointer?
为什么编译以下代码:
int main()
{
int j = 1;
int *jp = &j;
cout << "j is " << j << endl;
cout << "jp is " << jp << endl;
cout << "*jp is " << *jp << endl;
cout << "&j is " << &j << endl;
cout << "&jp is " << &jp << endl;
}
但不是这个?
#include <iostream>
using namespace std;
int main()
{
int j = 1;
int *jp;
*jp =& j; // This is the only change I have made.
cout << "j is " << j << endl;
cout << "jp is " << jp << endl;
cout << "*jp is " << *jp << endl;
cout << "&j is " << &j << endl;
cout << "&jp is " << &jp << endl;
}
当我做jp = &j
时,这是编译的,为什么?我只在另一行中初始化了jp
,这对我来说没有意义。
int *jp;
jp
是一个指针。它的值(jp
(是一个内存地址。它指向 ( *jp)
一个整数。当你这样做时
jp = &j;
这会将值设置为 j
的内存地址。所以现在*jp
将指向j
.当你这样做时
*jp = &j;
这会将jp
指向的事物的值设置为 j
的内存地址。当您执行以下操作时:
int *jp;
*jp = &j;
jp
尚未指向任何内容 - 其值未初始化。 *jp = &j
尝试遵循 jp
值的内存地址,这是随机的,并将其设置为 &j
...这可能会导致段错误。
澄清一下:(int *jp;
(中的*
与*jp = ...
中的不同。前者只是将jp
声明为指针。后者定义了您如何完成作业。为了使它更加明确,请执行:
int *jp = &j;
与
int *jp; jp = &j;
请注意,作业上没有*
。
*jp = &j;
就在这里。 记下*
. 这将获取指针指向的数据,类似于->
对对象执行的操作。 您在这里所做的是为 int 分配一个内存地址。 指针jp
指向一个名为 *jp
的 int
简而言之,jp
是指向int
(因此是地址(的指针,*jp
是jp
指向的int。 使用&j
可以获取j
的地址,或指向它的指针。
更改以下内容:
*jp =& j; //this is the only change I have made,
进入这个:
jp =& j;
这将使它编译。
编译int *jp = &j;
原因是因为它声明和初始化一个值。在非编译代码中,您正在执行分配。并尝试将整数表达式 ( *jp
( 分配给指针 ( &j
(。这完全没有意义。
如果您这样做:
jp = &j;
然后它将编译,因为您将指针表达式 ( &j
( 分配给指针变量 ( jp
(。在这种情况下存在类型一致性,因此编译是有意义的。
*jp =& j;
说"将&j
的值写入jp
指向的位置"。这是错误的 a( 因为 jp
不指向任何东西和 b( 因为 &j
是一个指针,jp
指向的值应该是 int,而不是指针。
int *jp = &j;
声明jp
是一个int*
(指向int的指针(,并用&j
(j
的地址(初始化它。
*jp = &j
取消引用指向 j
的指针(提供对 j
的引用(,然后尝试将&j
分配给j
。这是非法的,因为j
是int
,&j
是int*
。
你在脑海中解析错了。
声明:
int *jp = &j;
真的应该读成:
int* jp = &j;
导致肌动蛋白:
- 将
jp
声明为指向整数的指针 - 将
&j
的值分配给 JP
这与第二个代码块的更正相匹配:
int *jp;
jp = &j; // This is the only change I have made.
你被初始化和赋值之间的区别绊倒了;两者是不同的东西。
该行
int *jp = &j;
声明jp
为指向int
的指针,并使用表达式 &j
的结果对其进行初始化,表达式的类型为 "指向 int 的指针" (int *
(。
该行
*jp = &j;
尝试将表达式 &j
(其类型为 int *
,请记住(的结果分配给表达式 *jp
(其类型为 int
1(的结果。 由于两个表达式的类型不匹配,因此会出现编译时错误。
请注意,jp
尚未初始化为指向任何有意义的位置这一事实将是运行时错误,而不是编译时错误;IOW,如果你写了*jp = 5;
,程序会编译得很好(表达式*jp
和5
具有兼容的类型(,但当你尝试运行它时(很可能(会爆炸。
1 C 和 C++ 中的声明基于表达式的类型,而不是对象。 例如,我们将
jp
声明为指向int
的指针。 为了检索所指向的整数的值,我们使用 *
运算符取消引用指针,如语句中所示
x = *jp;
表达式*jp
的类型是 int
,因此指针的声明为
int *jp;
- 将一个类的方法指针存储到另一个类中
- 如何调用返回类方法指针的类方法
- 通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- C++;类方法指针;λ;将 lambda 作为成员函数指针传递;
- 使用模板、方法指针和字符串键入推导
- 将方法指针作为整数参数发送到C#的C 方法
- 从C 中的VTable获取方法指针
- 模板化方法指针 - 无法匹配函数参数的指针
- 获取特定的模板重载方法指针
- 如何将方法指针声明为Typedef方法参数
- 如何将方法指针类型转换为函数指针类型
- 如何在使用 pthreads 时将方法指针作为函数参数传递C++
- 方法指针映射,编译器说他们不接受任何参数
- C# 方法指针,如 C++ 中的指针
- c++创建新的LinkedList类:Clear()方法指针被释放未分配
- 尝试获取类方法指针时出现E_NOINTERFACE
- 传递和强制转换方法指针
- 常量方法指针的类型是什么
- 将对象的方法指针传递给接受 [静态方法指针/全局函数] 指针的函数