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

ne5o7dgx  于 2023-02-21  发布在  其他
关注(0)|答案(3)|浏览(111)

在下面的代码中,

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;
}
qcuzuvrc

qcuzuvrc1#

char *str1 = "141";定义了一个名为str1的指针,并将其初始化为字符串文字1 "141"(的第一个字符)的地址。字符串文字可能位于只读内存中。C标准没有定义程序试图修改字符串文字中的数据时会发生什么情况。
char str1[] = "141";定义了一个名为str1的数组,该数组足够大以包含字符串"141"(包括一个终止空字符),并初始化该数组以包含字符串文本的副本。该内存可由程序修改。

脚注

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

8xiog9wr

8xiog9wr2#

在这些声明中

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";

使用相等运算符结果

if ( str1 == str2 )

取决于所使用的实现:相同的字符串文字是存储为一个字符串文字还是不同的字符串文字。2通常编译器提供一个编译器选项,允许选择所需的行为。

piok6c0g

piok6c0g3#

char *str1 = "141";

一个主要的区别是,使用上面这样的指针,您可以将指针更改为指向其他地方。

str1 = "apple"; /* Now it points to the string literal "apple" */

然而,任何修改字符串文字的尝试都将调用C标准中未定义的行为。
另一方面,如果str1声明为字符数组:

char str1[] = "mango";

以下行为属违法:

/* Error: assignment to expression with array type */
str = "banana";

因为数组名不是一个可修改的左值,虽然,据我所知,这个限制没有什么好的理由,但是数组的元素是可以修改的。
在下面的代码中没有类型转换:

// explicit type casting
    int res1 = atoi(str1);
    // explicit type casting
    int res2 = atoi(str2);

atoi()函数的作用是:将nptr指向的字符串的初始部分转换为int。

相关问题