常量和指针

Constants and Pointers

本文关键字:指针 常量      更新时间:2023-10-16

这将是一个冗长的帖子,所以我提前道歉。但是试着根据上下文问多个问题:

所以,我一直在尝试学习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位置,并且我尝试了指针,引用,解引用等的每种可能组合。但是我只是打印了整个"Hello."数组和&p.

一个人到底是怎么得到一个常量数组的引用的?我想我理解的基本前提是,我正在创建一个数组,并立即分配到内存,然后分配一个指针(p)到第一个块("H")的位置。但我好像打印不出来。我能够在某一点上获得要打印的第一个块的位置(不记得我用了什么代码来做这件事)并将其绑定到for循环中,但即使这样……它总是打印第一个块的位置,即使被分配到[n]计数之后。

我不知道我错过了什么,在这里,或者如果我只是试图达到"在我的头上",但也许我只是不理解创建一个数组的用法/点,而不能够定位其中每个项目的内存分配。

这就引出了我的下一个问题。如何得到一个字符变量的内存位置,是否常数?我一直有这个代码的问题,以及:

char const a = 100;
int * b = &a;
cout << a << nl << *b << nl;
cout << nl;

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

我希望我只是错过了一个选项,使用它可能只是比我目前的位置"更高级"…但是如果我没有,我不太明白能够访问任何类型的变量/常量的块位置有什么意义,如果由于使用的类型的限制而不能访问所有类型的变量/常量。

这个问题也是限制第三个引号代码的原因:我不能仅仅分配一个变量来保存&p值,因为它本身必须是一个字符才能兼容。这是没有意义的,因为char不能保存8位数的引用。

In

const char * p = "Hello.";
[...]   cout << &p[n]   [...]

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