使用变量和使用指针定义值的区别

问题描述 投票:0回答:2

在下面的代码中,

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;
}
arrays c pointers initialization string-literals
2个回答
0
投票

char *str1 = "141";
定义了一个名为
str1
的指针,并将其初始化为字符串文字1
"141"
(的第一个字符)的地址。字符串文字可能在只读内存中。 C 标准没有定义如果程序试图修改字符串文字中的数据会发生什么。

char str1[] = "141";
定义了一个名为
str1
的数组,它的大小足以包含字符串“141”(包括终止空字符),并初始化该数组以包含字符串文字的副本。该内存可能会被程序修改。

脚注

1 从技术上讲,string literal 是源代码中带引号的字符串。由于 C 标准指定了程序的分析方式,因此处理字符串文字会导致创建一个静态数组,其中包含字符串文字指定的字符以及终止空字符。通常使用“字符串文字”来表示该数组以及源代码。


0
投票

在这些声明中

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 选择所需的行为。

© www.soinside.com 2019 - 2024. All rights reserved.