2009-09-26 86 views
3

在Schaum的C++书籍中学习代码,我看到很多使用char *,int *等的代码。 做了练习,我还看到在解决方案中有char *,并且在我的代码中我使用了char(没有星)。在C++中char和char *有什么区别?

我想知道一个char和一个指针char - integer和一个指针整数之间的区别是什么?我应该在哪里使用它们?他们的意思究竟是什么?

+2

应该阻止人们回答? – 2009-09-26 20:52:41

+1

char *通常用于遍历字符数组,即C字符串。与其他指针通常使用的方式不同,它很少用作指向单个字符的指针。 C++具有通常应该使用的更新的字符串结构。 – UncleO 2009-09-26 21:38:44

回答

6

带有*的变量是指针。

“普通”变量(例如char或int)包含该数据类型本身的值 - 该变量可以包含一个字符或一个整数。

指针是一种特殊的变量;它不包含值本身,它包含内存中的值的地址。例如,char *不直接包含字符,但它包含计算机内存中某个字符的地址。

您可以通过使用&采取“正常”变量的地址:

char c = 'X'; 
char * ptr = &c; // ptr contains the address of variable c in memory 

而你通过指针使用*得到内存的值:

char k = *ptr; // get the value of the char that ptr is pointing to into k 

Pointer (computing)在维基百科。

+0

我知道什么是指针 - 我想知道正常变量和指针之间的区别,以及为什么在某些情况下,我应该使用指针而不是普通变量。 – gujo 2009-09-26 19:32:11

+13

如果你知道指针是什么,那么你就知道它的区别。你明显不这样做。这并不那么简单,甚至在很长一段时间后,大“啊哈!”时刻到了。 – 2009-09-26 19:34:49

+2

如果你知道指针是什么,并且你知道int或char是什么,那么你也知道int和int *或者char和char *之间的区别。如果你不知道它们之间的区别,那么你不知道它们是什么。 – jalf 2009-09-26 21:39:56

0

对于char或int,变量值是实际分配的值 - “a”或42.对于char *或int *,变量值是存储实际分配值的位置。因此,*表示变量指向存储器中可找到值的位置。

2

指针指向特定变量的内存地址。起初有些人可能很难理解指针,关于它的更多信息请参见wikipedia

char *是一个指向内存中字符序列的指针,以'\ 0'结尾。一个字符代表一个字符。 int *将内存地址保存为整数值。

实施例:

int* x = new int(); 

我们在堆上创建一个新的整数变量,并且在存储器中的位置被保存在指针。指针现在指向整数所在的内存部分。如果我想使用的整数值的指针指向的话,我会叫:

int y = *x; 

这解引用的内存地址;它获得指针后面的值。 y的值将成为指针指向的内存后面的数据类型的值。

+0

我不得不买一本关于C语言的书,只是在指针上,但是一旦我理解了它们,C就变得易于编程了。 – 2009-09-26 19:24:46

5

您应该阅读您书中解释指针的第7章 - 您可能需要多个简短的答案才能真正理解该主题。

1

当你有char或者int或者long或者类似的东西时,那么内存将被留出来保存这个值,所以char是一个1字节的内存用于存储。

该字节的地址是指针指向的地址。

当你有一个字符串或连续的char行时,这很有帮助,因为你可以指向该字符串的开始,并将它传递给另一个函数,以便该函数可以使用字符串中的实际值。

所以,你用星号表示指针。

-1

带*的变量是指针。这意味着它们包含一个内存地址,而没有*的变量包含值。

所以一个字符包含一个字符值如'a'或'Z'。 char *指向一个内存区域,您可以通过char访问值char。

int变量包含一个整数值,如1或12345. int *指向可以通过int访问int值的内存区域。

对于所有其他类型都是如此。

实施例:

// pointer declaration 
char* pchar = new char[5]; 

此分配5 *的sizeof(char)的一个存储器区和可以访问5个字符。

当你的指针不再需要时,不要忘记释放内存。

// pointer destruction 
delete pchar; 
+2

您的示例没有分配5个字符的数组。它分配一个字符值为5. – erikkallen 2009-09-26 20:55:04

+0

糟糕使用'()'而不是'[]'。感谢您将它指向我 – 2009-09-27 08:04:31

0

OK,

我会在这坐刺。 charchar*之间的区别是编译器将变量放在您使用的内存中。

char c是一个堆栈声明。容器保存您放入其中的数据的值,并应用堆栈范围规则。当你击中方法体的末尾时,c会“超出范围”并自动清理。

char *c是一个指针变量。这意味着,变量不会保存您放入其中的数据的值,而是存储在内存中的地址,通常称为“内存地址”。然后我们说c是“堆”,你,程序员负责清理它。所以当c超出范围时不会自动清理,您需要调用delete来释放内存。

*,是一元运算符,也被称为deferencing operator

这里是一个很好的维基Dereference_operator

+1

指针不一定指向堆上的内存。有关指向堆栈内存的示例,请参阅Jesper的回答。 – Chuck 2009-09-26 20:33:28

0

char是一个值类型,因此引用该类型的变量得到一个字符。例如,

char ch = 'a'; 
cout << ch; // prints a 

char *是一个指向字符的指针,通常用于迭代字符串。例如,

char* s = "hello"; 
cout << s; // prints hello 
s++; 
cout << s; // prints ello 
相关问题