2023-09-03 深入辨析C语言字符数组与字符指针


老林的C语言新课, 想快速入门点此


深入辨析C语言字符数组与字符指针

  • 前言
  • 一、字符数组
  • 二、字符指针
  • 数组退化指针
  • 总结


前言

数组与指针联系密切, 尤其对于字符串, 什么时候用 strcpy(), 什么时候用 " = ", 经常有人弄错, 同时, 经常有人用非 const 修饰的指针指向一个字符字面常量, 这些基本功还是要砸实一些.


一、字符数组

C没有自己的字符串类型, 但可以有字符数组兼任, 非常简陋, 但效率极高.

字符数组可以在初始化时使用 " = " , 此时, 程序会将等号右边的字符串拷贝给字符数组

    char Arr[16] = "string";

之后则不可以用等号赋值, 只能用strcpy()赋值

    Arr = "other string"; // 错误
        
    strcpy(Arr, "other string"); //正确

非 const 字符数组可以更改字符串中的某个字符:

    Arr[0] = 'S';

字符数组可以用sizeof()获取数组所占空间大小:

    size_t size = sizeof(Arr);

字符数组不可以进行自增自减

    Arr++; // 错误
    ++Arr; // 错误

二、字符指针

const字符指针可以指向一个字符串字面常量:

    const char *ptr = "string";

但与字符数组的区别是指针不会复制字符串的任何内容, 同时const指针可以获取字符串的字符, 但不能改变它.

    char chr = ptr[0]; // 正确
    
    ptr[0] = '1'; //错误

字符指针可以指向一个非 const 数组,

    char *otherPtr = Arr;

然后可以改变字符串中的字符,

    otherPtr[0] = 'S';

同时, 字符指针可以使用自增自减运算符, 意思是指针指向字符串的下一个字符.

    otherPtr++;

字符指针的 sizeof() 运算得到的是指针所占空间, 64位系统一般固定8字节. 这与字符数组截然不同, 但极易混淆.

    size = sizeof(otherPtr); // 8

数组退化指针

调用数组时, 可以认为除了 sizeof() 运算, 都退化为指向字符串头字符的指针, 但要记住, 和一般指针的不同,

数组不可指向其他指针:

    Arr = otherPtr; // 错误

数组不可自增自减, 这个已经说过.

在声明时, 数组与指针严格区别. 相互不可替代

extern char arr[32];
extern char *arrPtr;

char arr[32] = "abc";
char *arrPtr = arr;

数组当作函数形参, 退化为指针, 失去空间信息, 必须用其他形参补充, 绝不可以在函数实现中用sizeof()获取形参数组空间.

int func(char arr[], int len);

总结

以上就是C字符数组与指针区别.


老林的C语言新课, 想快速入门点此


你可能感兴趣的:(笔记,c语言,字符数组,字符指针)