LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 389|回复: 0

声明指针

[复制链接]
发表于 2024-2-20 23:27:25 | 显示全部楼层 |阅读模式
由于指针能够直接引用它所指向的值,因此指针在指向 a 时与指向 an 或 a 时具有不同的属性。取消引用后,需要知道类型。为此,指针的声明需要包含指针将指向的数据类型。

指针的声明遵循以下语法:

其中 是指针指向的数据类型。此类型不是指针本身的类型,而是指针指向的数据的类型。例如:charintfloattype * name;type

int * number;
char * character;
double * decimals;

这是指针的三个声明。每个指针都指向不同的数据类型,但实际上,它们都是指针,并且它们都可能在内存中占用相同的空间量(指针的内存大小取决于运行程序的平台)。然而,它们所指向的数据所占的空间量不同,类型也不相同:第一个指向一个,第二个指向一个,最后一个指向一个。因此,尽管这三个示例变量都是指针,但它们实际上具有不同的类型:、 和 ,具体取决于它们指向的类型。

请注意,声明指针时使用的星号 () 仅表示它是一个指针(它是其类型复合说明符的一部分),不应与前面看到的取消引用运算符混淆,但该运算符也是用星号 () 编写的。它们只是用相同符号表示的两个不同事物。

让我们看一个关于指针的示例:intchardoubleint*char*double***

// my first pointer
#include <iostream>
using namespace std;

int main ()
{
  int firstvalue, secondvalue;
  int * mypointer;

  mypointer = &firstvalue;
  *mypointer = 10;
  mypointer = &secondvalue;
  *mypointer = 20;
  cout << "firstvalue is " << firstvalue << '\n';
  cout << "secondvalue is " << secondvalue << '\n';
  return 0;
}
firstvalue is 10
secondvalue is 20
在 cpp.sh 上编辑和运行

请注意,即使 NOR 都没有在程序中直接设置任何值,但两者最终都会通过使用 间接设置一个值。事情是这样的:

首先,使用 address-of 运算符 () 分配 firstvalue 的地址。然后,为 指向的值分配一个值 。因为,此时,指向的是 的内存位置,这实际上修改了 的值。

为了演示指针在程序中的生存期内可能指向不同的变量,该示例使用相同的指针 .

下面是一个更详细的例子:firstvaluesecondvaluemypointermypointer&mypointer10mypointerfirstvaluefirstvaluesecondvaluemypointer

// more pointers
#include <iostream>
using namespace std;

int main ()
{
  int firstvalue = 5, secondvalue = 15;
  int * p1, * p2;

  p1 = &firstvalue;  // p1 = address of firstvalue
  p2 = &secondvalue; // p2 = address of secondvalue
  *p1 = 10;          // value pointed to by p1 = 10
  *p2 = *p1;         // value pointed to by p2 = value pointed to by p1
  p1 = p2;           // p1 = p2 (value of pointer is copied)
  *p1 = 20;          // value pointed to by p1 = 20

  cout << "firstvalue is " << firstvalue << '\n';
  cout << "secondvalue is " << secondvalue << '\n';
  return 0;
}
firstvalue is 10
secondvalue is 20
在 cpp.sh 上编辑和运行

每个赋值操作都包含关于如何读取每行的注释:即,将 & 符号 () 替换为 “address of”,将星号 () 替换为 “value pointing to by”。

请注意,有些表达式带有指针 和 ,同时带有和不带有取消引用运算符 ()。使用取消引用运算符 (*) 的表达式的含义与不使用取消引用运算符的表达式非常不同。当此运算符位于指针名称之前时,表达式是指所指向的值,而当指针名称出现时没有此运算符时,它引用指针本身的值(即指针指向的地址)。

另一件可能引起您注意的事情是这句话:&*p1p2*

int * p1, * p2;

这将声明上一示例中使用的两个指针。但请注意,每个指针都有一个星号 (),以便两者都具有类型(指向 的指针)。由于优先级规则,这是必需的。请注意,如果代码是:*int*int

int * p1, p2;

p1确实是类型,但会是类型。就此而言,空间根本不重要。但无论如何,对于大多数有兴趣为每个语句声明多个指针的指针用户来说,只需记住每个指针放置一个星号就足够了。或者更好的是:对每个变量使用不同的语句。int*p2int

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表