1

这将是一个冗长的帖子,所以我提前道歉..但试图在上下文中提出多个问题:

所以,我一直在努力学习 C++,而且我已经相当容易地学会了一切,但我养成了一个习惯,即尝试以“略有不同的方式”在教程旁边做一些事情,以确保我理解我正在学习的东西的功能。

关于常量及其与指针的关系,我似乎遇到了心理障碍。

在上一节中,我认为我对引用、取消引用(以及 * 用于取消引用和指针时的区别)有了相当深入的了解,然后编写了以下代码:

int a[5];
int * p;

p = a;

cout << "Select the value for the first item at address(" << &a[0] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the second item at address(" << &a[1] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the third item at address(" << &a[2] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the fourth item at address(" << &a[3] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the fifth item at address(" << &a[4] << ")" << nl;
cin >> *p;

for (int n=0;n<5;n++)
    cout << a[n] << "(" << &a[n] << ")" << nl;

现在,我意识到这不一定是最“优化”的解决方案,但它确实有效,我能够“写入”到我存储在内存中的数组中,并显示更改。它很整洁,就像我说的那样……我想我对这些东西的工作原理有了很好的理解。

..然后,我点击了下一节,它使用了这个例子:

const char * terry = "hello";

教我,我引用:“在数组的情况下,编译器允许我们希望在声明指针的同时用常量初始化指针指向的内容”(这是在cplusplus.com教程)。

无论如何,直截了当:为了尝试熟悉它和上一节,我尝试编写:

const char * p = "Hello.";

for (int n=0;n<5;n++)
    cout << p[n] << "(" << &p[n] << ")" << nl;
    cout << nl;

..这不起作用。我基本上尝试复制我以前的代码(尽管没有写入方面),以便能够读取这个常量数组中每个字符的 RAM 位置,并且我尝试了指针、引用、取消引用等的所有可能组合。 .但我只是打印了整个“你好”。带有 &p 的数组。

到底是如何获得常量数组的引用的?我想我理解我正在创建一个数组并立即将其分配到内存,然后将指针(p)分配给第一个块(“H”)的位置的基本前提..但我似乎不能打印块。我能够得到第一个块的位置来打印(不记得我曾经这样做的代码)并将它绑定到 for 循环中,但即便如此..它总是打印的位置第一个块,即使被分配到 [n] 计数之后。

我不知道我在这里缺少什么,或者我是否只是想达到“头顶”,但也许我只是不了解创建数组的用法/要点而无法定位内存分配其中的每个项目..

不过,这让我想到了下一个问题。如何获得 char 变量的内存位置,无论是否为常量?我也遇到了这段代码的问题:

char const a = 100;
int * b = &a;

cout << a << nl << *b << nl;
cout << nl;

显然,这不起作用..因为我不能将 b 分配给 a 的位置,因为它们是不同的变量.. 显然制作一个 char 指针是愚蠢的,因为它只会打印混乱/空字符而不是位置(显然,我检查了这个......不仅仅是假设)。

我希望我只是错过了一个使用选项,它可能比我目前所处的位置“更先进”.. 但如果我不是,我不太明白能够访问该块的意义任何类型的变量/常量的位置,如果由于所使用类型的限制而无法访问所有变量/常量。

这个问题也限制了第三个引用代码:事实上我不能只分配一个变量来保存 &p 值,因为它本身必须是一个字符才能兼容..这是没有意义的,因为 char 可以'不持有八位数的参考。

4

1 回答 1

3

const char * p = "Hello.";

[...]   cout << &p[n]   [...]

&p[n]是一个指向 的指针char,并且cout::operator<<有一个重载,它接受一个指向 char 的指针并打印一个以 null 结尾的字符串,这可能就是你感到困惑的原因。

于 2013-03-20T13:44:09.650 回答