2013-03-20 96 views
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 tutorial上)。

无论如何,去点:为了尝试和与它和上一节自己熟悉,我试着写:

const char * p = "Hello."; 

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

..和这不起作用。我基本上试图复制我以前的代码(尽管没有写作方面),试图读取这个常量数组中每个字符的RAM位置,并且试验了指针,引用,解除引用等的各种可能组合。但我只是从整个“你好”中得到一张印刷品。与& p。

如何在地狱中获得恒定数组的引用?我想我理解的基本前提是我创建一个数组并立即将其分配给内存,然后为第一个块(“H”)的位置分配一个指针(p)..但我似乎无法将块打印出来。我能够得到第一个块打印的位置(不记得我用什么代码来做这件事)并将其绑定到for循环中,但即使如此......它总是打印出第一个区块,即使分配到遵循[n]计数。

我不知道我在想什么,在这里,或者如果我只是想达到“超过我的头”,但也许我只是不明白创建一个数组的用法/以定位其中的每个项目的内存分配..

虽然这带我到我的下一个问题。如何获取char变量的内存位置,无论是否为常量?我一直有问题,与此代码,以及:

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

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

显然,这并不工作..因为我不能分配b键的位置,因为他们是不同的变量..和显然使得一个char指针是愚蠢的,因为它只是打印乱码/空字符而不是位置(我检查了这一点,显然......不只是假设)。

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

这个问题是什么也限制了第三个引用的代码:我不能只是指定一个变量来保存p值,因为它本身必须是一个char兼容的。是没有意义的,因为char不能保存八位数的引用。

+2

你要去看一本小说吗? – 2013-03-20 13:41:46

回答

3

const char * p = "Hello."; 

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

&p[n]是一个指向char,并cout::operator<<具有过载,需要一个指针为char和打印空终止字符串,这可能就是你困惑。

+0

你将不得不原谅我没有受过教育,但我不完全听从你的意思。回想起来,我想我误解了那部分。你从技术上引用的代码工作,编译等,只是不符合要求。它本质上打印如下: H(你好) E(。ELLO) L(。LLO) L(。LO) O(。O) ,而不必在括号中的位置,因为我希望得到。我的困惑是因为我似乎无法在第一个位置之外打印任何位置..所以如果H例如存储在00000001中,那么即使使用计数器打印该文件,每次只会给出00000001。 – kovibear 2013-03-20 13:55:11

+0

@kovibear这就是我所说的 - 当试图用'cout <<'打印一个指向char的指针时,行为与打印,比如int不同。 – 2013-03-20 14:20:03

+0

啊,好的..是什么原因导致怪异的字符/空值或打印输出?看起来像乱码/错误,就像这样:╠╠╠╠ⁿ≈B。 因此,如果我理解正确,那么输出是cout处理打印整数和字符的结果是不同的?那么如何获得一个字符的参考位置来打印出来呢? ..或者就此而言,甚至为了变量而访问它? – kovibear 2013-03-20 14:30:47