You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法理解C++二级指针操作字符指针数组程序的运行结果差异

问题复现

你提供的可正常打印全部字符串的代码如下:

#include<iostream>
using namespace std;
char* str[] = {"Man", "Woman", "Car", "Plane", 0};
int main() {
    char** cp = str;
    while(*cp != 0)
        cout << *cp++ << endl;
    return 0;
}

将输出语句中的*cp++替换为**cp++后仅能输出每个字符串首字母,差异原因如下:

原因分析

  • 先明确各变量的类型定义
    • str是char*类型数组,每个元素存储对应字符串常量的首地址,最后一个元素为0(空指针)作为循环终止标记
    • cp是char**类型,即指向char*指针的指针,初始化时指向str数组的第一个元素
  • 运算符优先级说明
    后置自增运算符++的优先级高于解引用运算符*,因此*cp++等价于*(cp++),**cp++等价于*(*(cp++))
  • 两种写法的执行逻辑差异
    1. 使用*cp++的情况
      cp++会先返回cp的当前值,再将cp本身自增,指向str数组的下一个char*元素。对返回的原cp值做一次解引用,得到的是str数组当前位置存储的char*类型的字符串首地址,cout接收char*类型参数时,会自动从该地址开始逐个输出字符,直到遇到字符串结束符\0,因此可以完整打印整个字符串。
    2. 使用**cp++的情况
      同样先执行cp++返回原cp值,第一次解引用得到字符串首地址(char*类型),第二次解引用则会取到该首地址指向的第一个char类型的字符,也就是每个字符串的首字母。cout接收char类型参数时只会输出单个字符,因此最终只会打印每个字符串的首字母。

内容的提问来源于stack exchange,提问作者Harrison wells

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:30:01