在下面的代码中,
char *str1 = "141";
char *str2 = "3.14"
但也可以这样做:
char str1[] = "141";
char str2[] = "3.14"
我知道上面的那个是一个指针,但这里它比普通变量声明有什么优势?
// C program to demonstrate the
// functioning of the atoi() function
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* str1 = "141";
char* str2 = "3.14";
// explicit type casting
int res1 = atoi(str1);
// explicit type casting
int res2 = atoi(str2);
printf("atoi(%s) is %d \n", str1, res1);
printf("atoi(%s) is %d \n", str2, res2);
return 0;
}
char *str1 = "141";
定义了一个名为 str1
的指针,并将其初始化为字符串文字1 "141"
(的第一个字符)的地址。字符串文字可能在只读内存中。 C 标准没有定义如果程序试图修改字符串文字中的数据会发生什么。
char str1[] = "141";
定义了一个名为 str1
的数组,它的大小足以包含字符串“141”(包括终止空字符),并初始化该数组以包含字符串文字的副本。该内存可能会被程序修改。
1 从技术上讲,string literal 是源代码中带引号的字符串。由于 C 标准指定了程序的分析方式,因此处理字符串文字会导致创建一个静态数组,其中包含字符串文字指定的字符以及终止空字符。通常使用“字符串文字”来表示该数组以及源代码。
在这些声明中
char *str1 = "141";
char *str2 = "3.14"
有指向字符串文字的声明指针。
字符串文字具有静态存储持续时间和任何更改字符串文字的尝试,例如
str1[0] = '2';
导致未定义的行为。
所以最好用限定符声明指向字符串文字的指针
const
const char *str1 = "141";
const char *str2 = "3.14"
在此声明中
char str1[] = "141";
char str2[] = "3.14"
有声明的数组,其元素由字符串文字的元素初始化。您可以更改数组的元素,因为它们未使用限定符
const
声明。您也可以使用 sizeof
运算符来获取存储字符串的长度,例如
size_t n1 = sizeof( str1 ) - 1;
如果你要写例子请注意
const char *str1 = "141";
const char *str2 = "141";
使用相等运算符 like 的结果
if ( str1 == str2 )
取决于使用的实现:相同的字符串文字是存储为一个字符串文字还是不同的字符串文字。通常编译器会提供一个编译器选项,允许 tp 选择所需的行为。