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

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

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

为了方便比较结果,定义全局变量LENGTH15,定义输出函数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 < length; i++){   printf("0x%x ", *(chars + i));}} else if (type == 0){for (int i = 0; i < length; i++){   printf("%c", *(chars + i));}}printf("\n");
}

其中type0时直接输出字符串,为16时,以16进制输出。

字符数组

以字符串赋值

char array_1[LENGTH] = "array_1";
print(array_1, LENGTH, 16);
printf("%ld\n", sizeof(array_1));

先来看结果

0x61 0x72 0x72 0x61 0x79 0x5f 0x31 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
15

这种情况下,字符串以0结尾,并且没有赋值的部分,也都已经初始化为char类型的0

strcpy赋值

char array_2[LENGTH];
strcpy(array_2, "array_2");
print(array_2, LENGTH, 16);
printf("%ld\n", sizeof(array_1));

结果为

0x61 0x72 0x72 0x61 0x79 0x5f 0x32 0x0 0xfffffff0 0x6c 0x7f 0x0 0x0 0xffffffc0 0xfffffff3
15

可见,使用strcpy函数赋值,字符串到\0结束,之后的数据,类型都是随机的。

和方法一对比可知,字符数组在声明时,是没有初始化为全零的。

以字符数组赋值

在C语言中,一个字符串结束的标志位是\0, 那么在用于初始化的字符数组最后一位要不要写\0呢?

不加\0的情况:

char array_3[LENGTH] = {'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<stdlib.h>
#include<string.h>
#include<stdio.h>#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 < length; i++){   printf("0x%x ", *(chars + i));}} else if (type == 0){for (int i = 0; i < length; i++){   printf("%c", *(chars + i));}}printf("\n");
}int main()
{// 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;
}

C语言中字符串的初始化相关推荐

  1. c语言字符串转成二进制,C语言中字符串如何转换为二进制、八进制、十进制、十六进制...

    在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现 相关函数: atof, atoi, atol, st ...

  2. C语言中字符串的处理方式(一)

    写多了 Java 代码,对 String 类 很是喜爱,可惜经典的 C 语言没有...最近在做程序过程中,发现对C语言字符串的处理很模糊,一会儿用数组,一会儿用指针,一会儿又引入 string.h.. ...

  3. C语言中字符串的处理方式

    http://www.cnblogs.com/robin-ty/archive/2010/09/03/1817294.html 交流纽带" --<C语言程序设计 现代方法> 写多 ...

  4. 在C语言中如何处理字符串,C语言中字符串的处理方式

    <C语言中字符串的处理方式>由会员分享,可在线阅读,更多相关<C语言中字符串的处理方式(4页珍藏版)>请在人人文库网上搜索. 1.C语言中字符串的处理方式"很难从字符 ...

  5. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

    代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...

  6. Go语言中字符串的查找方法小结

    这篇文章主要介绍了Go语言中字符串的查找方法小结,示例的main函数都是导入strings包然后使用其中的方法,需要的朋友可以参考下 1.func Contains(s, substr string) ...

  7. [工具]-C语言中字符串的形式打印16进制数据

    C语言中字符串的形式打印16进制数据. 这样写,输出更直观些 #define PRINT_BUF_MAX (32) #define TAG_STRING_MAX (32) static void pr ...

  8. c语言中字符 12是多少,c语言中字符串的讲解(DOC可编).doc

    c语言中字符串的讲解(DOC可编).doc 第一部分:字符串的概念 ---字符串:用双引号引起来的一串字符.在C语言,系统将自动的为字符串添加一个结束标志\0 ,该结束标志不作为字符串的实际长度,但作 ...

  9. [转载] Java 语言中的实例初始化块 ( IIB) 详解

    参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...

最新文章

  1. 自动驾驶领域:一种实时高精度的城市道路场景语义分割方法
  2. 群雄逐鹿,谁将赢得5G时代的物联网战争?
  3. 【Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )
  4. Android 内存溢出解决方案(OOM) 整理总结
  5. 航天器的“回家路线”有几种
  6. 在Linux上编写并运行Java文件
  7. 36.Silverlight中播放视频和打印文档【附带源码实例】
  8. 希尔排序(C++版)
  9. Mysql存储结构B树与B+树与索引
  10. android老 电池,为什么安卓手机不会因为电池的老化而降频呢?
  11. 阿里云服务器安装onlyoffice_阿里云服务器安装 JDK 8
  12. curl返回常见错误码
  13. catch(…) vs catch(CException *)?
  14. volley浅析(磨砺营马剑威Android)
  15. mysql 自动备份脚本+自动上传
  16. Vue源码:mustache模板引擎学习
  17. 多目标跟踪综述-Multiple Object Tracking: A Literature Review
  18. handsome 404页面
  19. 倪明选:追忆似水流年,祝愿更加辉煌
  20. mysql5.7 性能优化配置 innodb_buffer_pool_size

热门文章

  1. HBuilder 真机调试提示:手机上没有信任本计算机的授权,请在手机上信任该授权
  2. 干货 | 深度学习之卷积神经网络(CNN)的模型结构
  3. 钱币组合问题(动态规划)
  4. 【转】2023年Java学习路线图-黑马程序员
  5. 没有技术含量,但能每天赚50刀的GGAD赚钱办法分享
  6. CSS3 3D旋转立方
  7. ubuntu下使用vscode开发golang程序,从控制台到简单web程序
  8. python与vba的区别_选择VBA还是Python?
  9. php 实现 js escape unescape
  10. 表单reset重置按钮的作用并非是清空表单