Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针只是一个键值对吗?_C++_Pointers - Fatal编程技术网

C++ 指针只是一个键值对吗?

C++ 指针只是一个键值对吗?,c++,pointers,C++,Pointers,指针只是一个键值对吗?例如: int n = 3; int *p = &n; p; // <0x...> &p; // 3 int n=3; int*p=&n; p、 // &p、 //3. 似乎类似于(在JavaScript中): var o={};//计算机上的存储器 变量p='';//存储器中的钥匙、地址 var n=3; 变量o[p]=n;//在内存中创建键值对 p、 /”; o、 p;//3我认为这个比喻没有用。指针可以指向任何东西,包括它不能指向的内存

指针只是一个键值对吗?例如:

int n = 3;
int *p = &n;
p; // <0x...>
&p; // 3
int n=3;
int*p=&n;
p、 //
&p、 //3.
似乎类似于(在JavaScript中):

var o={};//计算机上的存储器
变量p='';//存储器中的钥匙、地址
var n=3;
变量o[p]=n;//在内存中创建键值对
p、 /”;

o、 p;//3我认为这个比喻没有用。指针可以指向任何东西,包括它不能指向的内存区域,这会导致未定义的行为。考虑这一点:

int *ptr = new int(123);
delete ptr;
// ptr no longer points to anything accessible,
// dereferencing it would yield undefined behaviour
或者这个:

int *f()
{
  int i = 123;
  return &i;
}

int *ptr = f();
// ptr no longer points to anything accessible,
// dereferencing it would yield undefined behaviour
struct S {};
S s;
int *ptr = reinterpret_cast<int*>(&s);
// bad cast, dereferencing ptr would yield undefined behaviour
或者这个:

int *f()
{
  int i = 123;
  return &i;
}

int *ptr = f();
// ptr no longer points to anything accessible,
// dereferencing it would yield undefined behaviour
struct S {};
S s;
int *ptr = reinterpret_cast<int*>(&s);
// bad cast, dereferencing ptr would yield undefined behaviour
struct S{};
S S;
int*ptr=重新解释铸件(&s);
//错误的强制转换,取消引用ptr将产生未定义的行为

因此,正如您所看到的,拥有一个“键”(指针)并不意味着存在任何有效的“值”(指针对象)。

我认为这个类比是没有用的。指针可以指向任何东西,包括它不能指向的内存区域,这会导致未定义的行为。考虑这一点:

int *ptr = new int(123);
delete ptr;
// ptr no longer points to anything accessible,
// dereferencing it would yield undefined behaviour
或者这个:

int *f()
{
  int i = 123;
  return &i;
}

int *ptr = f();
// ptr no longer points to anything accessible,
// dereferencing it would yield undefined behaviour
struct S {};
S s;
int *ptr = reinterpret_cast<int*>(&s);
// bad cast, dereferencing ptr would yield undefined behaviour
或者这个:

int *f()
{
  int i = 123;
  return &i;
}

int *ptr = f();
// ptr no longer points to anything accessible,
// dereferencing it would yield undefined behaviour
struct S {};
S s;
int *ptr = reinterpret_cast<int*>(&s);
// bad cast, dereferencing ptr would yield undefined behaviour
struct S{};
S S;
int*ptr=重新解释铸件(&s);
//错误的强制转换,取消引用ptr将产生未定义的行为

因此,正如您所看到的,拥有一个“键”(指针)并不意味着存在任何有效的“值”(指针对象)。

您实际遇到的问题是没有得到正确的范例。我可以看出,您正试图凭借在高级编程方面的经验进入C编程语言的世界。第一个问题是为什么C?人们通常用C做什么

为了更直接地回答您的问题,C是(唯一)一种擅长直接操作内存和内存映射地址的语言。在用c语言编程时,您需要对计算机体系结构有基本的了解(在哪里分配东西,甚至分配意味着什么等等)。这里的指针基本上是一个单词长的值,用来保存一个地址,指针的类型给你们一些线索,那个地址中保存了什么。所以我建议不要把键值对和指针联系起来,这不是正确的“范例”


从历史上看,人们使用C来做更多更高级的事情,但是这些任务逐渐转移到更高级的语言中,这些语言具有更好的表达能力,当然性能更差。如今研究C意味着打破黑匣子,找出里面的东西,这不仅仅是建立语言特性连接。要真正理解C,您需要准备一些计算机体系结构和o/s概念方面的知识,然后用这些“语言”而不是更高层次的概念来思考。

您实际遇到的问题是没有正确使用范例。我可以看出,您正试图凭借在高级编程方面的经验进入C编程语言的世界。第一个问题是为什么C?人们通常用C做什么

为了更直接地回答您的问题,C是(唯一)一种擅长直接操作内存和内存映射地址的语言。在用c语言编程时,您需要对计算机体系结构有基本的了解(在哪里分配东西,甚至分配意味着什么等等)。这里的指针基本上是一个单词长的值,用来保存一个地址,指针的类型给你们一些线索,那个地址中保存了什么。所以我建议不要把键值对和指针联系起来,这不是正确的“范例”


从历史上看,人们使用C来做更多更高级的事情,但是这些任务逐渐转移到更高级的语言中,这些语言具有更好的表达能力,当然性能更差。如今研究C意味着打破黑匣子,找出里面的东西,这不仅仅是建立语言特性连接。要真正理解C,你需要准备一些关于计算机体系结构和o/s概念的知识,然后用这些“语言”而不是更高层次的概念来思考。

用一种奇怪的方式,它是。。。但是,您必须将其视为在数组上操作,而不是在任何类型的稀疏容器上操作,并且该数组是计算机中的整个可寻址内存

然后,“key”是可以用来查找字节的内存地址!这真的很简单,但它给人们带来了困难,因为他们试图用抽象的术语来理解它

内存是一个巨大的字节块,指针是其中一个字节的编号

现在变得复杂的是,当您将指针正在寻址的字节定义为字节以外的内容时。你可以说“这个指针指向一个字符串或结构,然后你必须在心里将指针所指向的字节转换为其他内容。对于字符串来说,这很简单——指针地址所在的字节是字符串中的第一个字符,随后的每个字节都是下一个字符。指针仍然只对第一个字符(即第一个字节)进行寻址,但剩下的字节将由您(或您的编译器)作为更复杂的构造进行处理

在C语言中,假设你有一个字符串,说“Hello”,你有一个指向第一个字节的指针,你可以把指针加上3,然后用“Z”替换这个新地址的字节,然后你的字符串将读作“HeZlo”。只需将3添加到指针,就可以寻址字符串中的第3个字节。然而,这里有一个陷阱让你绊倒,如果你把它添加到指针上,它现在指向地址3个字节,而不是原来的地址,所以你的字符串会读为“Zlo”,因为你“移动”了指针。出于这个原因,人们倾向于将指针视为一种更不透明的类型,因此从概念上讲,它更容易避免使用指针,并导致我刚才描述的问题

随着时间的推移,语言编写者对它们进行了进一步的抽象,因此我们有了智能指针和引用,以及像javascript这样的奇特容器。。。但这些都是围绕原始指针和内存的包装

还有一件事需要理解。您必须存储指针d