22.指针和字符数组

22.指针-指针和数组-指针和字符数组


22.1 知识点

知识回顾1 字符数组

字符数组是类型为字符 char 的一维数组。字符数组可以用字符串初始化,默认会在结尾加上 \0 结束符号。

char charArr[] = "Hello World";

字符数组可以直接用于打印,但需要用 \0 表示结束。

char charArr2[] = { 'A', 'B', 'C' };
// 会越界,知道遇到 \0 才会结束,会导致出现乱码
// cout << charArr2 << endl; // 乱码

遇到 \0 就会停止。

char charArr3[] = { 'A', 'B', 'C', '\0' };
cout << charArr3 << endl; // ABC

知识回顾2 指针和常量

  • 指向常量的指针const* 前面,值不能改,指向可以改。
  • 指针常量const* 后面,值可以改,指向不能改。
  • 指向常量的指针常量const* 前后都加,值和指向都不能改。

知识回顾3 指针和一维数组建立联系

  • 数组变量名:
char* ptrChar = charArr;
  • 第一个元素的地址:
ptrChar = &charArr[0];

指向常量的字符指针可以直接用字符串赋值

指向常量的字符指针指向能变、值不能变。

const char* ptrChar2 = "测试用字符串";
// 注意:老版本的C++中甚至是可以不用加const

字符指针可以直接用于打印

cout << ptrChar2 << endl; // 测试用字符串

注意:指针指向的字符数组一定要有 \0,否则一样会越界。

// ptrChar2 = charArr2;
// cout << ptrChar2 << endl; // 乱码
// ABC烫烫烫烫烫烫烫烫烫烫烫烫烫烫藺BC

利用字符指针遍历字符串

字符指针使用 for 循环遍历时不太方便,因为它有可能指向的是一个字符串字面量,不太好去获取容量。

使用 while 循环时,必须确保有 \0,否则会越界。

while (*ptrChar2 != '\0')
{
    cout << *ptrChar2;
    ptrChar2++;
}

为了让字符指针不要自增而改变指向的位置,我们可以加一个偏移量来保证不动:

int index = 0;
while (*(ptrChar2 + index) != '\0')
{
    cout << *(ptrChar2 + index);
    ++index;
}

可以封装成一个函数,不会改变指针本身的值:

void printPtrChar(const char* p)
{
    int index = 0;
    while (*(p + index) != '\0')
    {
        cout << *(p + index);
        ++index;
    }
    cout << endl;
}

总结

字符指针在很多场景下可以当成字符串或者字符数组来使用。


22.2 知识点代码

Lesson22_指针_指针和数组_指针和字符数组.cpp

#include <iostream>
using namespace std;

void printPtrChar(const char* p);
int main()
{
    std::cout << "指针和字符数组\n";

    #pragma region 知识回顾1 字符数组

    //1.字符数组就是类型为字符char的一维数组

    //2.字符数组可以用字符串初始化(默认会在结尾加上\0结束符号)
    char charArr[] = "Hellow World";

    //3.字符数组可以直接用于打印,但是需要用\0表示结束
    char charArr2[] = { 'A', 'B', 'C' };
    //会越界,知道遇到\0才会结束,会导致出现乱码
    //cout << charArr2 << endl;//乱码

    //遇到\0就会停止
    char charArr3[] = { 'A', 'B', 'C', '\0' };
    cout << charArr3 << endl;//ABC

    #pragma endregion

    #pragma region 知识回顾2 指针和常量

    //指向常量的指针: const在 *前面,值不能改,指向可以改
    //指针常量:const在 *后面,值可以改,指向不能改
    //指向常量的指针常量:const在 *前后都加,值和指向都不能改了

    #pragma endregion

    #pragma region 知识回顾3 指针和一维数组建立联系

    //1.数组变量名
    char* ptrChar = charArr;

    //2.第一个元素的地址
    ptrChar = &charArr[0];

    #pragma endregion

    #pragma region 知识点一 指向常量的字符指针可以直接用字符串赋值

    //指向常量的字符指针 指向能变、值不能变
    const char* ptrChar2 = "测试用字符串";
    //注意:老版本的C++中甚至是可以不用加const

    #pragma endregion

    #pragma region 知识点二 字符指针可以直接用于打印

    cout << ptrChar2 << endl;//测试用字符串

    //注意:指针指向的字符数组一定要有\0 否则一样会越界
    //ptrChar2 = charArr2;
    //cout << ptrChar2 << endl;//乱码 ABC烫烫烫烫烫烫烫烫烫烫烫烫烫烫藺BC

    #pragma endregion

    #pragma region 知识点三 利用字符指针遍历字符串

    //字符指针 用for循环遍历 就不太方便了 因为它有可能指向的是一个字符串字面量 不太好去获取容量

    //使用while循环 这种方式一定要保证 有\0 否则会越界
    while (*ptrChar2 != '\0')
    {
        cout << *ptrChar2;
        ptrChar2++;
    }

    //为了让字符指针不要自增减去改变指向的位置
    //我们可以加一个偏移量 来保证不动
    int index = 0;
    while (*(ptrChar2 + index) != '\0')
    {
        cout << *(ptrChar2 + index);
        ++index;
    }

    //可以封装成一个函数 不会改变指针本身的值
    printPtrChar(ptrChar2);
    printPtrChar(ptrChar2);

    #pragma endregion
}

void printPtrChar(const char* p)
{
    int index = 0;
    while (*(p + index) != '\0')
    {
        cout << *(p + index);
        ++index;
    }
    cout << endl;
}

#pragma region 总结
//字符指针在很多场景下可以当成字符串或者字符数组来使用
#pragma endregion

22.3 练习题

char str[] = “hello”;str 和 &str[0]有什么区别? str + 1 和 &str[1]的值和含义是否相同?

  1. str是一个数组名,表示整个数组的首地址;&str[0]是数组第一个元素的首地址。此时他们的地址是一致的。

  2. str + 1 表示从数组首地址偏移一个元素所占字节数,因此表示第二个元素的地址。

    &str[1] 表示显示的去除第一个元素的地址。

    此时他们的地址是一致的。

const char* ptrChar = “测试用字符串”;请使用for循环利用字符指针打印出该字符串内容

const char* ptrChar = "测试用字符串";
for (int i = 0; *(ptrChar + i) != '\0'; i++)
{
    cout << *(ptrChar + i);
}
cout << endl;


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏