我对C中的以下概念有误解。
要定义字符串,您可以执行以下AFAIK之一:
在这里定义一个像这样的字符数组:
char array[];
或者将字符串定义为char数组。让我们这样说:
char * str,
为什么我会看到一些使用指针方法的书籍而其他书籍使用常规定义?
答案 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
个系列的内存。每个都适用于不同的上下文,具体取决于相关代码如何接收字符串以及它使用它做了什么。