typedef字符型指针的字符串使用

本文分享了编程新手初次接触编程时如何使用字符指针指示字符串,并通过实例展示了如何进行字符串的基本操作。从简单的字符数组到指针的运用,为后续深入学习编程语言打下坚实基础。

刚来报到,刚接触编程时不会使用字符串,发现字符char的指针能指示字符串。纪念我的编程时代的开始~

int main()
{

     typedef char *pstring;
     const pstring cstr = "abcd";
     const pstring *ps = &cstr;
     decltype (cstr) ci ="efgh";

     std::cout << cstr[2] << ","<< *ps <<","<< ci<< std::endl;
     system("pause");
     return 0;
}

在 C++ 中,**指针、数组指针字符串指针**指针的不同应用场景。它们本质上都是指针,但用法和语义不同。下面进行系统性小结,并附代码示例。 --- ## ✅ 一、基本概念回顾 | 名称 | 含义 | |------|------| | **指针** | 存储变量地址的变量,`*p` 可访问其指向的内容 | | **数组指针** | 指向整个数组的指针(如 `int (*p)[N]`) | | **指针** | 多用于二维数组中,指向某一行的一维数组 | | **字符串指针** | 指向字符序列(字符串)的指针,类型为 `char*` | --- ## ✅ 二、1. 字符串指针(最常见) ### 🔹 定义: 指向以 `\0` 结尾的字符序列。 ```cpp char* str = "Hello, World!"; ``` ### 🔹 示例: ```cpp #include <iostream> using namespace std; int main() { char* str = "NCU I loVE yUo!"; // 字符串字面量指针 cout << str << endl; // 输出完整字符串 cout << *str << endl; // 输出第一个字符 'N' cout << str[7] << endl; // 输出第8个字符 'E' // 遍历 for (int i = 0; str[i] != '\0'; ++i) { cout << str[i]; } cout << endl; return 0; } ``` ### ⚠️ 注意事项: - 字符串字面量是 `const`,不应修改: ❌ `str[0] = 'X';` → 危险!可能导致崩溃。 - 推荐写法:`const char* str = "..."` 更安全。 ### ✅ 动态字符串指针: ```cpp char* dynamic_str = new char[50]; strcpy(dynamic_str, "Hello from heap!"); cout << dynamic_str << endl; delete[] dynamic_str; // 记得释放 ``` --- ## ✅ 三、2. 数组指针(指向整个一维数组) ### 🔹 定义: 一个指向“具有 N 个元素的一维数组”的指针。 #### 语法: ```cpp int (*p)[N]; // p 是一个指针,指向含有 N 个 int 的数组 ``` ### 🔹 示例:操作二维数组的行 ```cpp #include <iostream> using namespace std; int main() { int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int (*row_ptr)[4] = arr; // 指向第一行(含4个int的数组) // 使用 row_ptr 访问数据 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { cout << row_ptr[i][j] << " "; // 等价于 arr[i][j] } cout << endl; } return 0; } ``` ### 🔍 解释: - `row_ptr` 是一个 **数组指针**,它每次移动跨越 `4 * sizeof(int)` 字节; - `row_ptr + 1` 指向第二行; - `*(row_ptr + i) + j` 得到第 i 行第 j 列的地址。 --- ## ✅ 四、3. 行指针(本质就是数组指针) > “行指针”不是独立类型,而是对二维数组中每一行的指针的俗称。 ### 📌 场景:遍历二维数组的每一行 ```cpp for (int (*p)[4] = arr; p < arr + 3; ++p) { // p 指向当前行 for (int j = 0; j < 4; ++j) { cout << (*p)[j] << " "; // 访问该行元素 } cout << endl; } ``` 也可以简化为: ```cpp typedef int (*RowPtr)[4]; // 定义别名 RowPtr p = arr; ``` --- ## ✅ 五、对比总结表 | 类型 | 声明方式 | 典型用途 | 移动单位 | |------|----------|----------|---------| | **字符串指针** | `char*` | 指向字符串 | 每次 `+1` 移动 1 字节 | | **数组指针 / 行指针** | `int (*)[N]` | 指向一维数组或二维数组的一行 | 每次 `+1` 移动 `N * sizeof(type)` 字节 | | **普通指针** | `int*` | 指向单个整数或一维数组元素 | 每次 `+1` 移动 `sizeof(int)` 字节 | --- ## ✅ 六、常见错误与建议 ### ❌ 错误1:混淆数组名和指针 ```cpp int a[10]; int* p = a; // OK: a 自动转为 int* int (*q)[10] = &a; // OK: q 指向整个数组 // int (*r)[5] = a; // ERROR: 类型不匹配 ``` ### ❌ 错误2:越界访问 确保循环边界正确,尤其是使用指针算术时。 ### ✅ 建议: - 多维数组优先使用 **数组指针** 或封装成结构体/类; - 字符串优先使用 `std::string` 和 `const char*`; - 避免手动内存管理,除非必要。 --- ## ✅ 七、现代 C++ 替代方案(推荐) ```cpp #include <vector> #include <string> // 字符串 std::string str = "NCU I loVE yUo!"; // 二维数组(动态) std::vector<std::vector<int>> matrix(3, std::vector<int>(4)); // 使用更安全、自动管理内存 ``` 优势: - 不需要关心指针细节; - 无内存泄漏风险; - 支持拷贝、赋值等操作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值