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]的值和含义是否相同?
str是一个数组名,表示整个数组的首地址;&str[0]是数组第一个元素的首地址。此时他们的地址是一致的。
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