什么是char *?

时间:2011-07-25 22:41:39

标签: c++ pointers

所以我一直在看大学关于C ++的讲座,我学到了很多东西,但有一件事我还是听不懂:

为什么有时必须这样做?

char* test = "testing";

从我读过/看过的内容来看,我只是不明白你为什么要放*。根据我的想法,如果你有一个地址,你只能使用*,但也许我只是错了。

7 个答案:

答案 0 :(得分:15)

这是char

char c = 't';

一次只能容纳一个 char acter ! :)


这是一个C字符串:

char sz[] = "test";

它可以“保持”不仅仅是一个 char


char*指向多个char s序列的内存位置。

char sz[] = {'t', 'e', 's', 't', 0};

const char *psz = "test";

注意:

*psz == 't';
*(psz + 1) == 'e';
*(psz + 2) == 's';
*(psz + 3) == 't';
*(psz + 4) == 0; // NUL

sz[0] == 't';
sz[1] == 'e';
sz[2] == 's';
sz[3] == 't';
sz[4] == 0; // NUL

答案 1 :(得分:4)

char类型只能表示单个字符。如果有一系列字符,它们将在内存中彼此相邻堆叠,并返回该序列中第一个字符的位置(分配给测试)。测试只不过是指向“测试”中第一个字符的内存位置的指针,说它指向的类型是一个字符。

答案 2 :(得分:3)

你可以做以下两件事之一:

char *test = "testing";

或:

char test[] = "testing";

或者,这些主题的一些变体如:

char const *test = "testing";

我提到这个主要是因为它是你通常真正想要的那个。

然而,底线是char x;只会定义一个字符。如果你想要一个字符串,你必须定义一个char数组或一个指向char的指针(你将用字符串文字初始化,如上所述,通常是这样)。

但前两个选项之间存在实际差异。 char *test=...定义了一个名为test的指针,该指针初始化为指向字符串文字。字符串文字本身是静态分配的(通常与程序的代码一起),你不应该(试图)修改它 - 因此偏好char const *

char test[] = ..分配一个数组。如果它是全局的,它与前面的非常相似,只是它为指向字符串文字的指针分配一个单独的空间 - 相反,test成为附加到字符串的名称文字本身。

如果您将此作为局部变量执行,test仍将直接引用字符串文字 - 但由于它是一个局部变量,它会分配“自动”存储(通常在堆栈上),它会被初始化(通常来自正常的,静态分配的字符串文字),它定义在块/范围的每个条目上。

后面的版本(带有char数组)可以看似与指针类似,因为只要将数组传递给函数,数组的名称就会衰减到数组开头的地址。但是存在差异。您可以修改数组,但修改字符串文字会产生未定义的行为。相反,您可以将指针更改为指向其他char s,如下所示:

char *test = "testing";

if (whatever)
    test = "not testing any more";

...非常好,但尝试对数组做同样的操作是不行的(数组不可分配)。

答案 3 :(得分:1)

使用*表示此变量指向内存中的某个位置。在这种情况下,它指向字符串“testing”的位置。使用char指针,您不仅限于单个字符,因为现在您有更多可用空间。

答案 4 :(得分:0)

char*表示char的连续内存块开头的地址。你需要它,因为你没有使用一个char变量来处理整个char

数组

访问此功能时,函数将获取第一个char的地址并逐步通过内存。这是可能的,因为数组使用连续的内存(即所有内存在内存中都是连续的)。

希望这可以解决问题! :)

答案 5 :(得分:0)

人们忘记提到的主要问题是"testing"是内存中的字符数组,c ++中没有原始字符串类型。因此,与任何其他数组一样,您不能将其称为元素。

答案 6 :(得分:-3)

在C中,数组由指向其中第一个元素的指针表示。