声明指针的方法

Ways to a declare a pointer?

本文关键字:方法 指针 声明      更新时间:2023-10-16

为什么编译以下代码:

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(因此是地址(的指针,*jpjp指向的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。这是非法的,因为jint&jint*

你在脑海中解析错了。

声明:

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;,程序会编译得很好(表达式*jp5具有兼容的类型(,但当你尝试运行它时(很可能(会爆炸。


1 C 和 C++ 中的声明基于表达式的类型,而不是对象。 例如,我们将jp声明为指向int的指针。 为了检索所指向的整数的值,我们使用 * 运算符取消引用指针,如语句中所示
x = *jp;  

表达式*jp的类型是 int ,因此指针的声明为

int *jp;