我最近开始学习c ++并且遇到了指针的概念(它是一个存储另一个变量地址的变量)。然而,我也遇到了 #include <iostream>
using namespace std;
void fun1();
int main()
{
fun1();
}
void fun1(){
int x ;
int sum = 1 ;
cout << "Enter your number:";
cin >> x ;
if ( x >= 1 ){
for ( int i = x ; i > 1 ; i--){
sum *= i ;
}
}
cout << "Factorial of " << x << " is :" << sum ;
}
,我感到困惑。所以它看起来像&#34;你好&#34;被分配给指针str(我虽然只能存储地址)。那么指针也能存储一个字符串吗?
答案 0 :(得分:1)
指针将存储字符串开头的地址,因此是第一个字符。在这种情况下,“Hello”是一个不可变的文字。 (Check the difference: Immutable vs constant)
更准确地说,指针不能存储字符串以及任何内容,指针可以指向指向包含指针类型数据的地址。
由于char*
是指向char
的指针,因此它指向char
。
答案 1 :(得分:1)
为了将来参考,您应该只使用您正在使用的语言的语言标记。 C和C ++是两种非常不同的语言,在这种情况下,是的区别。
首先是公共部分:像"Hello"
这样的文字字符串由编译器存储为数组。在"Hello"
的情况下,它是一个包含六个char
元素的数组,包括字符串null终结符。
现在对于不同的部分:在C ++中,这样的字符串文字数组是常量,它们不能被修改。因此,有一个非const指针指向这样的数组是一个错误。在C中,字符串文字数组不是常量,但它们仍然不可修改,它们本质上是只读的。但它仍然允许有一个非const指针指向它们。
最后针对你的问题:与所有数组一样,使用它们会使它们衰变为指向第一个元素的指针,这基本上就是这里发生的事情。您使变量str
指向字符串文字数组中的第一个元素。
有点简化,可以这样看(在 C 中):
char anonymous_literal_array[] = "Hello";
...
char *str = &anonymous_literal_array[0]; // Make str point to first element in array
答案 2 :(得分:0)
在此示例中,指针是字符串中第一个字符的地址。这是继承自C,其中一个&#34;字符串&#34;是由NULL字符终止的字符数组。在C和C ++中,数组和指针密切相关。当您进行自己的内存管理时,通常会创建一个带有指向数组第一个元素的指针的数组。这正是这里的数据包含字符串文字"Hello"
。
答案 3 :(得分:0)
字符串存储为字符数组。文字字符串如&#34; Hello&#34;实际上返回保存此字符串的临时只读字符数组的开始。
答案 4 :(得分:0)
char *变量是指向内存中单个字节(char)的指针。处理字符串的最常用方法称为c样式字符串,其中char *是指向字符串中第一个字符的指针,后跟内存中的其余字符。 c-string总是以&#39; \ 0&#39;或空字符表示您已到达字符串的末尾(&#39; H&#39;,&#39; e&#39;,&#39; l&#39;,&#39; l& #39;,&#39; o&#39;,&#39; \ 0&#39;)。
&#34; Hello&#34; 被称为字符串文字。在内存中发生的事情是在你的程序的最开始,在运行任何其他程序之前,程序为&#34; Hello&#34;分配和设置内存。其他静态常量所在的字符串。当您编写 char * str =&#34; Hello&#34 ;; 编译器知道您正在使用字符串文字并将 str 设置为该位置该字符串文字的第一个字符。
但要小心。所有字符串文字都存储在您无法写入的内存部分中。如果您尝试修改该字符串,则可能会出现内存错误。为了确保这不会发生,在处理c字符串时,你应该总是写 const char * str =&#34; Hello&#34 ;; 这样编译器永远不会允许你要修改那个记忆。
要拥有可修改的字符串,您需要自己分配和管理内存。我建议使用std :: string,或者有一些乐趣并创建自己的字符串类来处理内存。