C字符串,字符和指针

时间:2016-05-09 10:01:44

标签: c

我对C中的以下概念有误解。

要定义字符串,您可以执行以下AFAIK之一:

在这里定义一个像这样的字符数组:

char array[];

或者将字符串定义为char数组。让我们这样说:

char * str,

为什么我会看到一些使用指针方法的书籍而其他书籍使用常规定义?

2 个答案:

答案 0 :(得分:3)

简短的回答不会让你的问题变得正义。你问的是关于C的两个最重要但经常被误解的方面。

首先,在C中,根据定义,字符串是一个字符数组,以空字符'\0'结尾。

所以,如果你说

char string1[] = "Hello";

就像你说过的那样

char string1[] = {'H', 'e', 'l', 'l', 'o', '\0'};

在程序中使用类似"Hello"的字符串常量时,编译器会自动为您构造数组。

接下来我们有字符指针类型char *。你将这个字符串称为char数组",但它实际上是指向单个char指针。人们经常引用{{1}作为C"字符串类型",并且在某种程度上它是,但它可能是一个误导性的事情,因为不是每个char *都是一个字符串,更重要的是C几乎没有为您自动管理字符串的机制。 (我的意思是,在C语言中,您不能像在C ++或BASIC中那样只是将字符串放在一起,就好像它们是基本数据类型一样。您通常需要担心它们存储在何处,他们如何分配。)

但是让我们回到字符串的定义。如果字符串是数组字符,那么为什么字符的指针对于操作字符串有用呢?答案是,指针对于在C中操作数组总是有用的;指针非常善于操作数组,有时看起来好像它们数组。 (但不要担心,他们不会。)

我不能在这里深入研究C中数组和指针之间关系的完整论述,但必须提出几点:

如果你说的话

char *

实际发生的事情(编译器自动为您做了什么)就好像您已经编写了

char *string2 = "world";

实际上,由于static char __temporaryarray[] = "world"; char *string2 = __temporaryarray; 是一个指向一个字符的指针(也就是说,它指的是字符,而不是整个字符数组),它真的是:​​

string2

(也就是说,指针实际指向数组的第一个元素。)

因为字符串始终是一个数组,所以当您在上下文中提到字符串char *string2 = &__temporaryarray[0]; 时,您没有使用它来初始化数组。 C继续为你创建数组,然后使指针指向它。只要你的程序中有一个字符串常量,C就会这样做。所以你以后可以说

"world"

你也可以说

之类的东西
string2 = "sailor";

不要做

if(strcmp(string1, "Goodbye") == 0) { ... }

这非常错误,并且根本无法可靠地工作,因为没有人为char *string3; strcpy(string3, "Rutabaga"); /* WRONG!! *// 分配任何内存指向,string3将字符串复制到。< / p>

因此,为了回答您的问题,您有时会看到创建或操作的字符串就像它们是数组一样,因为它们实际上是什么。但是你经常会看到它们使用指针(strcpy)进行操作,因为只要你知道自己在做什么就可以非常方便。

答案 1 :(得分:1)

  

为什么我会看到一些使用指针方法的书籍而其他书籍使用常规定义?

这些都不是正常的&#34;比另一个。 C中的字符串纯粹是以char字符结尾的0连续(不间断)系列。您可以使用char[]来引用它,或者您可以使用char *const char *等来引用它。它们只是引用块的方式内存中包含char个系列的内存。每个都适用于不同的上下文,具体取决于相关代码如何接收字符串以及它使用它做了什么。