常数和指针

时间:2013-03-20 13:40:03

标签: c++ pointers constants

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

所以,我一直在努力学习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上tutorial)。

无论如何,为了达到目的:为了尝试熟悉它和上一节,我尝试写作:

const char * p = "Hello.";

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

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

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

我不知道我在这里缺少什么,或者我只是想要“超越我的脑袋”,但也许我只是不明白创建阵列的用法/点而不能定位其中每个项目的记忆分配..

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

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

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

显然,这不起作用..因为我不能将b分配给a的位置,因为它们是不同的变量..显然使char指针很傻,因为它只是打印乱搞/ null字符而不是位置(我检查了这一点,显然......不仅仅是假设)。

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

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

1 个答案:

答案 0 :(得分:3)

const char * p = "Hello.";

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

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