理解char数组[]和字符串

时间:2015-03-31 10:45:20

标签: c++ c arrays pointers char

我是编程新手。我正在学习C作为我的第一门编程语言。我发现一些奇怪的东西要理解。

我已经了解到在C中我们可以将String表示为像这样的字符序列(使用char数组):

char status[10] = "Married";   

我已经了解到这种方法的问题是我们必须在编译期间告诉status数组的大小。

但是现在我已经知道我们可以使用char指针来表示string喜欢 -

char status[10] = "Married";
char *strPtr;
strPtr = status;

我不能理解它。我的问题是 -

  1. 如何使用strPtr在索引4( 结婚)中获取字符?

  2. status中,\0数组所代表的string末尾有一个空字符char - M - a - r - r - i - e - d - \0。因此,通过使用空字符(\0),我们可以理解字符串的结尾。当我们使用strPtr时,我们如何理解string的结尾?

6 个答案:

答案 0 :(得分:14)

char *strPtr;
strPtr = status;

现在你的指针strPtr指向数组中的第一个字符,你可以

int i =0;
while( strPtr[i] != '\0')
{
  printf("%c ",strPtr[i]);
  i++;
}
调用

*strPtr取消引用指针,以获取存储在指针指向的位置的值。

记下

strPtr[4] = *(strPtr +4); 

两者都可以获得存储在数组索引4处的值。

请注意指针和数组名称之间的区别:

----------------------------------
| s  | t  | r  | i  | n | g | \0 |
----------------------------------
  |
strPtr
status

strPtr ++将使指针指向数组中的下一个元素。

| s  | t  | r  | i  | n | g | \0 |
----------------------------------
       |
      strPtr

而您不能为数组名称

执行此操作

status++是不允许的,因为an array is not a modifiable lvalue

答案 1 :(得分:4)

很高兴知道:

char status[10] = "Married";

只是等效的语法糖

char status[10]; // allocate 10 Bytes on stack
status[0] = 'M';
status[1] = 'a';
...
status[6]= 'd';
status[7] = '\0'; // same as 0

没有更多,没有更少。

此外:

char c = status[3];

完全相同
char c = *(status+3);

答案 2 :(得分:3)

表达式status[10]仅仅是*(status+10)的语法糖。

在底层使用\0终止来检查结束,如果你自己实现了一些字符串处理程序,你也可以这样做,或者你可以忽略它并使用其他参数{{1}用字符串给出,或者你可以(不要!)选择其他任何东西作为终止符号。

这不仅适用于size数组或“字符串”,C数组只是指向类似类型的连续块的指针,并且编译时检查“数组”下标不要超出声明时指定的“结束”。使用char表示法,您需要自己检查一下。

答案 3 :(得分:3)

要获得索引4 strPtr处的字符,您只需使用strPtr[4](这也适用于status)。

要在使用strPtr时获取字符串的结尾,您需要浏览字符并查找终止\0。这是printf("%s", strPtr)在打印字符串时所做的事情(以及它解析"%s"表达式时的情况,这只是另一个字符串)。要在C中查找字符串中的许多有效字符,请使用strlen()函数。哦,并确保你不做这样的事情:

char a[3];
strcpy(a, "Hello!");

因为这会将7个字节写入3字节的存储空间,因此会覆盖您不想覆盖的内容。

答案 4 :(得分:2)

字符串末尾的'\ 0'是一个无用的附加组件,旨在简化或安全。你可以像这样使用'sizeof'告诉字符串最后一个字符:

char status[] = "Married"; 

size_t szLastCharstatus = sizeof(status) / sizeof(status[0]) - 2;

char chLastChar = status[szLastCharstatus];

详细说明:

sizeof(status)

返回数组occpuies的字节数。

sizeof(status[0])

返回第一个元素占用的字节数(以及其余的)。

这两个值之间的区别给出了数组中元素的数量。要访问最后一个元素,我们需要减去一次,因为数组中的元素从零开始计数,因为字符串中的最后一个字符是'\ 0'。

另请注意,数组不是指针,反之亦然。数组有一个隐式转换为第一个元素的指针,常量大小和它们自己的类型。它们可以通过指针或值传递(使用结构hack是第二个)。

请注意,我使用的是“size_t”,它是存储一定数量数据的变量的类型def。

答案 5 :(得分:2)

我要做一个挑衅性的陈述:想到这个的方法是 C没有字符串C只有char的数组。尽管它的名称,char实际上是一个数字类型('A',例如,只是一种编写数字的有趣方式,通常是65)。

char数组与int数组或任何其他数值类型数组没有什么不同;只是语言提供了一些额外的方法来编写char类型的对象及其数组,并且有一个通用约定(用strlen等函数系统化)来解释如何解释存储在{{char中的数据1}}数组作为字符串的表示。

char status[10];     // declares an array of `char` of length 10. 
char *strPtr;        // declare a pointer to `char`
strPtr = status;     // make `strPtr` point to the first element of `status`

// Declare an array of 6 `char`, and initialize it.
char hello[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

// Shorthand notation for initializing an array of 6 `char` as above
char world[6] = "World";

// I want to store numeric data in this one!
char other[6] = {0, 1, 2, 3, 4, 5};

// "World" is shorthand for a constant array of 6 `char`. This is
// shorthand for telling the compiler to actually put that array in
// memory someplace, and initialize worldPtr to point to that memory.
const char *worldPtr = "World";

// This does the same thing as above. But it's still a *constant* array.
// You should *never* do this; it should be syntactically illegal to
// make a nonconstant `char*` to point to it. This is only allowed for
// historical reasons.
char *helloPtr = "Hello";