//      实际上, c中并没有字符串这种数据类型,  也就是说c是没有像java, .net等其他高级语言中常用的String类型.
     
      首先要强调:
      a. c语言有无字符串?         有!
      b. c语言有无字符串类型    无!
      c. c语言字符串是否就是不是字符数组   是!
      b. c语言字符串和字符数组是同一样东西?   不是!

实际上,  c语言中, 字符串是1个特殊的字符数组,  特殊在什么地方? 就是字符数组最后1个元素可以是任意字符, 而字符串(属于字符数组的最后1个元素是'\000',

也就是说, c

1.字符类型

char 就是c的字符类型
定义1个字符变量,跟住赋值.
char a;
a='a';   //这里只能用单引号,  双引号只能用于字符数组.

打印这个字符:
printf("char a is %c",a)

2.字符数组
   由名字得知, 字符数组实际上是1个数组,其性质与数字型数组其实很类似的, 但是也有一些区别.

定义1个字符数组:
char c[5];  //:定义1个长度为5的字符数组,  也就是有5个字符元素啦
char c[];   // 错误,定义1个数组同时必须指定它的长度
赋值:

c[0]='a';c[1]='b';c[2]='c';c[3]='d';c[4]='e';    //正确
c ="abcde";     //错误
c={'a','b','c','d','e'}; //错误 因为c数组定义时已经设定了长度5, 而数组的长度一旦定义就不会改变, 所以c认为这种赋值不合法,因为有机会改变字符数组c的长度.

例子:


执行结果:

可以见到, 字符数组定义后, 赋值相当麻烦啊.  而且不像数字型赋值, 不方便循环赋值..
所以一般在定义1个字符数组语句同时执行赋值:
char c[]={'a','b','c','d','e'}  //  正确
这样的话, 字符数组c在定义的同时它的各个元素和长度也被定义为5了.

char c[5]={'a','b','c','d','e'} //正确
char c[4]= {'a','b','c','d','e'}  //错误, 制定长度为4, 但是赋予5个元素
char c[7]={'a','b','c','d','e'} //正确, 但是c[5]和c[6]这两个元素都被设为NULL '\000'  注意不是'0'啊

例子:

执行结果:


可以见到d的长度是6, 但是d[5]的值显示不出来,  因为上面已经提过, 如果赋值的元素个数少于数组长度, 后面的元素会自动被赋值成'\0', 而'\0'是个空字符.

debug一下就可以看清楚了:

 
而这时字符数组d就是1个字符串了, 因为他是以'\000'结尾的字符数组啊!

3.字符串
     上面都提过很多次了,  字符串是以'\000' 结尾的字符数组.

定义1个字符串:
     char c[]={'c','d','e','f','d','g','\000'}; // 长度为7
     而实际上还可以这样定义:
     char c[]="cdefdg"  // 系统会自动补1个Null字符'\000'到这个字符串的最后1个元素, 长度也是7
     char c[7]="cdefdg" //正确  这个是最常用的字符串变量赋值方法.

char c[6]="cdefdg"  //这个不是字符串, 长度不足以容纳最后1个NULL字符'\000'
    
看个例子:

执行结果:

上面c 于d都是字符串, 因为他们都是'\000'结尾的, 而e是1个普通的字符数组:
函数sizeof返回的是数组长度, 它会将'\000'计算在内
而函数strlen返回的是字符串长度, 它不会计算'\000'在内  <string.h>

所以对于字符串来讲 sizeof(d) =7 它有7个元素嘛,  但是strlen长度只有6
而对于一般字符串(没有'\000'字符, sizeof 和 strlen 返回的结果是一样的)

现在我修改一下这个函数, 令
字符串c的第4个字符c[4]='\000':

执行结果:

可以见到 字符串c 居然显示3个字符"cde", 了 strlen长度也只有3
因为printf 函数 和strlen函数一样, 都会从字符数组的头1个元素往后面遍历, 当遇到'\000'时,就会认为这是1个字符串, 而且会在这里结束.


4. 一些指针的意思:

         定义1个字符串:
         char c[]="abcdef"; //

这样c就是1个长度为7的字符数组(也是字符串)c,c的元素包括 'a','b','c','d','e','f','\000', 上面已经解析过了.

而实际上, 跟int类型的数组名一样, 这里的字符串(也是字符数组)名字c本身就是1个字符型指针,  它指向数组c的一个的元素c[0]的地址.
         也就是讲:
         *c == c[0] = 'a'
         *(c+1) = c[1] = 'b'
         *(c+i) = c(i)   //这个是经典公式啊.

也可以定义1个字符型指针*p
         char *p;
  
    给p赋值:
    p=c;   //因为数组名c也是指针啊, 所以不需要取址符&,  p=&c;是错误的!

这样, p与c就是等价的(指向同1个地址
    *p == c[0] = 'a' = p[0]
    *(c+1) = c[1] = 'b' = p[1]
    *(p+i) = p(i)=c(i)   //这个是经典公式啊.

有另1个种定义数组的方法:
       char *q = "abcdef"  ,
       这样指针q也是只向1个字符串. 用法跟上面指针p差不多

例子:

输出:

可以见到:
1. 用数组c的长度是7(sizeof(c)), 而字符串长度是6(strlen).
    而用指针p去只想数组c, 求sizeof(p) 是多了1个元素的, 尾部多1个'\000',就是两个'\000'结尾啦, 但是字符串长度是一样的.

2. 可以见到 sizeof 和 strlen的参数实际上都是指针(c和p和q)都是指针.
所以在c语言中, 有很多函数的参数实际上都是指针, 这就是用地址传递产生了
例如
int strlen(char* p){     //这里char* p表示p是1个字符型参数,  而定义1个字符串p使用char *p;的 注意区别~

}

见到输出, p与q的部分是完全一样的,
是否p与q的用法就完全一样呢?

不是的
首先我定义字符串c时:
char c[]="abcdef"

这个c是1个字符串变量

那么p=c;  p就指向1个字符串变量了

执行
p[1] = 'k';
p[2] ='h';  //都是合法的, 因为变量的值可以改变嘛

而定义1个字符指针q
char *p="abcdef"; 时

首先系统会定义1个字符串常量"abcdef",
然后指针p指向这个常量.

执行
q[1]='k'; 是不合法的, 因为常量的值不能修改, 所以里面的元素的值也不允许的修改的.

所以要定义1个字符串, 而且打算修改时 不要用

char *p="abcdef";

这种方式, 但是用于常量时就推荐这种~

C 语言里的字符串---字符数组相关推荐

  1. C语言字符型数组ppt,C语言第13讲指针与字符串(字符数组).ppt

    C语言第13讲指针与字符串(字符数组).ppt 6.2.3 指针与字符串(字符数组) C语言用字符数组存放字符串. 字符数组元素个数确定,一般用下标控制循环. 字符串有效字符个数由0确定,用结束符0控 ...

  2. 字符串字符数组和基本类型的相互转换

    1.基本类型转为字符数组或字符串 ❶整形转为字符数组: char *itoa(int value, char *string, int radix); value 将要被转换的值.string 转换的 ...

  3. JAVA关于字符串字符数组处理的小题目

    JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...

  4. C++ 复制字符串/字符数组

     题目 [项目1-小心地放开玩字符串/字符数组] (2)读程序,请分析其实现的功能 [cpp] view plaincopyprint? #include<iostream> usin ...

  5. java 字符串转list_浅谈java 字符串,字符数组,list间的转化

    1.关于java.lang.string.split xxx.split()方法可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.字符串转字符数组 String str =" ...

  6. 小心地放开玩字符串/字符数组(二)某类字符的个数

    /* * Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:徐凯旋 * 完成日期:2012 年 12 ...

  7. 【C 语言】字符串操作 ( C 字符串 | 字符数组始化 )

    文章目录 一.C 字符串 二.字符数组始化 一.C 字符串 C 字符串特征 : C 语言中的字符串都是以 '\0'字符 结尾的 字符数组 ; C 字符串本质 : C 中 没有字符串类型 , 都是使用 ...

  8. 字符串字符数组的赋值

     字符数组的定义与初始化 Char str[10] = {'a','b','c','d','e'}; 如果说提供的字符的个数大于数组的长度,就按语法错误处理,如果小于数组的长度,不够的位置用空字符 ...

  9. C语言博客作业--字符数组

    一.PTA实验作业 题目1:统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 Begin定义字符型变量ch,pre=' ': 定义整型变量count://用来记录单词个数 count← ...

最新文章

  1. C++ operator两种用法【转】
  2. Android运行时识别API版本
  3. How Tomcat Works(八)
  4. JAVA返回指定字符串的长度,Java截取指定字节长度的字符串
  5. 20210928 对角化的充要条件
  6. Java Persistence API:快速入门
  7. CTO 技术管理的“三板斧”
  8. UVA 2519 Radar Installtion
  9. orm设置bool型 python_详解python的ORM中Pony用法
  10. dell延长对显卡的保修服务
  11. 解决龙芯2F使用oprofile-0.9.7无法采样应用程序函数的问题
  12. mysql文章相似度计算_文章相似度计算
  13. 仿百度糯米TP5项目笔记
  14. Python 10个项目创意
  15. 中兴B863AV3.2-M、B863AV3.1-M2、E900V22C免拆机通刷救砖包【安卓9.0】
  16. 微信不显示王者荣耀连接服务器,王者荣耀省级不显示,王者荣耀不用微信怎么登录...
  17. 什么是Android手机
  18. 虚拟直播需要哪些设备?如何搭建虚拟直播团队?
  19. 求一个数的最小素因子外加快速分解质因子
  20. HSI、HSV、RGB、CMY、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型(转)

热门文章

  1. 【django】自定义中间件
  2. boot.img详解
  3. (39)通过 PID 获取 EPROCESS
  4. C++ priority_queue用法
  5. a[1]和1[a]——浅谈数组下标运算符
  6. MoeCTF 2021Re部分------Midpython.exe
  7. 某设备产品漏洞挖掘-从JS文件挖掘RCE
  8. Windows驱动开发学习笔记(三)—— 内核空间内核模块
  9. Windows保护模式学习笔记(四)—— 中断门陷阱门
  10. 将字符串型转换为整形