C语言中字符串的初始化 您所在的位置:网站首页 挪威语言是什么语言类型 C语言中字符串的初始化

C语言中字符串的初始化

2023-12-03 06:37| 来源: 网络整理| 查看: 265

字符串是最常用的数据类型之一。

C语言中,是没有String类型来存储字符串的,字符串被看做是一组连续的char类型。

所以,字符串有两种表示方法,分别是字符数组和字符指针,而这两种表示的初始化却又不尽相同。

为了方便比较结果,定义全局变量LENGTH为15,定义输出函数print如下:

/** Display the outputs. * args: chars[], The char array to print. * length, The size of the char array you wanna print. * type, Tht format you wanna print those chars. * 16: hexadecimal * 0: chars */ void print(char* chars, int length, int type){ // printf("%ld:", sizeof(chars)); if (type == 16) { for (int i = 0; i for (int i = 0; i 'a', 'r', 'r', 'a', 'y', '_', '3'}; print(array_3, LENGTH, 16); printf("%ld\n", sizeof(array_1));

结果为

0x61 0x72 0x72 0x61 0x79 0x5f 0x33 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 15

加\0的情况

char array_4[LENGTH] = {'a', 'r', 'r', 'a', 'y', '_', '4', '\0'}; print(array_4, LENGTH, 16); printf("%ld\n", sizeof(array_1));

结果为

0x61 0x72 0x72 0x61 0x79 0x5f 0x34 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 15

可见,这两种方法并没有什么区别。直接赋值时,数组会按声明的长度,把每个位置都初始化为\0。

值得一提 声明为数组的变量,是不能先申明,再用常量赋值的。以下两种写法都不能通过编译。 char array_5[LENGTH]; array_5 = "test"; array_5 = {'t', 'e', 's', 't'}; 另外,用sizeof实际上是求的指针变量的大小,也就是数组声明的长度。但是用strlen函数可以求出字符串的有效长度,也就是到\0的长度,可自行验证。 字符指针

在将变量声明为指针时,只有两种赋值方法。

以字符串直接赋值 char* pointer_1 = "pointer_1"; print(pointer_1, LENGTH, 16); printf("%ld\n", sizeof(pointer_1));

结果为

0x70 0x6f 0x69 0x6e 0x74 0x65 0x72 0x5f 0x31 0x0 0x70 0x6f 0x69 0x6e 0x74 8

值得注意的是,此时,sizeof求出的是字符指针的大小,而非字符串的长度。

以字符串间接赋值 char* pointer_5; pointer_5 = "pointer_5"; print(pointer_5, LENGTH, 16); printf("%ld\n", sizeof(pointer_1));

结果为

0x70 0x6f 0x69 0x6e 0x74 0x65 0x72 0x5f 0x35 0x0 0x0 0x1 0x1b 0x3 0x3b 8 其他方法

在使用**strcpy函数赋值**时,编译器会提示指针变量未初始化。

可见以数组声明时,虽然数组中的值没有初始化为0,但是地址空间已经得到了。

而用指针声明时,没有指明长度,自然没办法申请空间。

至于用字符数组赋值的方法,由于现在变量是声明为字符指针的,类型不同,自然是行不通的。

完整测试代码 #include #include #include #define LENGTH 15 /** Display the outputs. * args: chars[], The char array to print. * length, The size of the char array you wanna print. * type, Tht format you wanna print those chars. * 16: hexadecimal * 0: chars */ void print(char* chars, int length, int type){ // printf("%ld:", sizeof(chars)); if (type == 16) { for (int i = 0; i for (int i = 0; i // Define as array; char array_1[LENGTH] = "array_1"; print(array_1, LENGTH, 16); printf("%ld\n", sizeof(array_1)); char array_2[LENGTH]; strcpy(array_2, "array_2"); print(array_2, LENGTH, 16); printf("%ld\n", sizeof(array_1)); char array_3[LENGTH] = {'a', 'r', 'r', 'a', 'y', '_', '3'}; print(array_3, LENGTH, 16); printf("%ld\n", sizeof(array_1)); char array_4[LENGTH] = {'a', 'r', 'r', 'a', 'y', '_', '4', '\0'}; print(array_4, LENGTH, 16); printf("%ld\n", sizeof(array_1)); // char array_5[LENGTH]; // array_5 = "test"; // Define as pointer. char* pointer_1 = "pointer_1"; print(pointer_1, LENGTH, 16); printf("%ld\n", sizeof(pointer_1)); // char* pointer_2; // strcpy(pointer_2, "pointer_2"); // print(pointer_2, LENGTH, 16); // char* pointer_3 = {'p', 'o', 'i', 'n', 't', 'e', 'r', '_', '3'}; // print(pointer_3, LENGTH, 16); // char* pointer_4 = {'p', 'o', 'i', 'n', 't', 'e', 'r', '_', '3', '\0'}; // print(pointer_4, LENGTH, 16); char* pointer_5; pointer_5 = "pointer_5"; print(pointer_5, LENGTH, 16); printf("%ld\n", sizeof(pointer_1)); return 0; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有