C53-字符串引入和注意事项.

一 基础语法

1. 底层关系

  • 字符串本质是char[](字符数组)以\0(空字符)结尾的特殊形式。
char str[] = "hello";  // 实际存储:['h','e','l','l','o','\0']
  • ✅ 可像数组一样通过下标访问字符
printf("%c", str[1]); // 输出 'e'

2.三种字符串的定义方式

  1. char CharArry1[]={'h','e','l','l','o'};//不常用 
    
  2. char CharArry2[]="hello";
    
  3. char *pCharArry3="hello";	//是常量指针
    
  4. 对比:第一种不太实用;第二三种比较:第二种可读可修改,第三种可读不可修改,是常量指针

    1. 数组:元素可修改(如arr[0] = 'H'合法)。
    2. 指针:指向的内容不可修改(如p[0] = 'H'非法)

第三中定义方式的测试:

  • 代码示例:
#include 
int main()
{
    char CharArry2[]="hello";
    char *pCharArry3="hello";

    for(int i=0;i<5;i++)
    {
        printf("%c",*(pCharArry3+i));
    }
    return 0;
}
  • 成果展示:

C53-字符串引入和注意事项._第1张图片

二 字符串的内存存放方式及结束标志

  • 存放方式:char[](字符数组)以\0(空字符)结尾。这也导致了它的长度增加了1
char str[] = "hello";  // 实际存储:['h','e','l','l','o','\0']
  • 代码示例:
#include 
int main()
{   
    int Arry[5]={1,2,3,4,5};
    char CharArry[]="hello";
    char CharArry1[]={'h','e','l','l','o'};

    int len1;
    int len2;
    int len3;

    len1=sizeof(Arry)/sizeof(Arry[0]);
    len2=sizeof(CharArry)/sizeof(CharArry[0]);
    len3=sizeof(CharArry1)/sizeof(CharArry1[0]);

    printf("len1:%d\nlen2:%d\nlen3:%d",len1,len2,len3);

    return 0;
}

  • 成果展示:

C53-字符串引入和注意事项._第2张图片

三 sizeof与strlen的区别(非常重要)

相同点

  1. 均用于获取大小/长度信息
    两者都返回一个与内存或字符串相关的数值(sizeof 返回字节数,strlen 返回字符数)。

不同点

特性 sizeof strlen
作用对象 任何数据类型(变量、类型、数组等) 仅适用于字符串(以 \0 结尾的字符数组)
计算时机 编译时确定(静态求值) 运行时动态计算(遍历字符串直到 \0
返回值类型 size_t(无符号整数) size_t(无符号整数)
是否包含 \0 包含 \0 的占用空间 不包含 \0(仅统计 \0 前的字符数)
对指针的处理 返回指针本身的大小(通常4/8字节) 需指向有效字符串,否则行为未定义
示例 sizeof(int)sizeof(arr) strlen("hello")

总结

  • sizeof:编译器运算符,计算对象或类型的内存占用(包括 \0)。
  • strlen:库函数,运行时计算字符串的实际字符数(不包括 \0)。

我们直接测试

  • 代码示例:
#include 
#include 

int main()
{   
    char CharArry[100]="hello";
    //测试:sizeof返回字节数
    printf(" sizeof(CharArry):%d\n",sizeof(CharArry));
    //测试:strlen返回字符数
    printf(" strlen(CharArry):%d\n\n",strlen(CharArry));

    char CharArry1[]="hello";
    //测试:sizeof包含\0的占用空间
    printf("sizeof(CharArry1):%d\n",sizeof(CharArry1));
    //测试:strlen不包含\0(仅统计\0前的字符数)
    printf("strlen(CharArry1):%d\n\n",strlen(CharArry1));

    char *PString="hello";
    char *PString1;
    //测试:sizeof返回指针本身的大小(通常4/8字节)
    printf("  sizeof(PString):%d\n",sizeof(PString));
    //测试:需指向有效字符串,否则行为未定义
    printf("  strlen(PString):%d\n",strlen(PString));
    printf(" strlen(PString1):%d\n\n",strlen(PString1));

    return 0;
}

  • 成果展示:C53-字符串引入和注意事项._第3张图片

你可能感兴趣的:(#,C语言学习录,c++,开发语言,c语言,笔记)