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

如何通过指向指针的指针获取字符串数组的元素个数

问题解决:通过指针获取数组元素个数

你遇到的核心问题是:数组赋值给指针后会退化为指针,丢失了原数组的长度信息,所以无法仅通过指针p直接计算元素个数。以下是几种可行的解决方案:

方案1:额外存储数组长度

在给指针p赋值的同时,同步记录对应数组的长度。这种方法简单直接,适合已知数组长度的场景:

using namespace std;
const char *options[3] = {"Option1", "Option2", "Option3"};
const char *options2[2] = {"Option1", "Option2"};

int main() {
  const char **p;
  size_t arr_len;

  if (true) {
    p = options;
    arr_len = sizeof(options) / sizeof(options[0]);
  } else {
    p = options2;
    arr_len = sizeof(options2) / sizeof(options2[0]);
  }

  printf("%zu\n", arr_len); // 根据条件输出3或2
  return 0;
}

方案2:用结束标记遍历计数

在数组末尾添加一个特殊标记(比如NULL),通过遍历指针直到遇到标记来统计元素个数:

using namespace std;
// 末尾添加NULL作为结束标志
const char *options[] = {"Option1", "Option2", "Option3", NULL};
const char *options2[] = {"Option1", "Option2", NULL};

int main() {
  const char **p;

  if (true) {
    p = options;
  } else {
    p = options2;
  }

  size_t count = 0;
  // 遍历直到遇到NULL
  while (*p != NULL) {
    count++;
    p++;
  }
  printf("%zu\n", count); // 根据条件输出3或2
  return 0;
}

方案3:使用C++容器替代原生数组

如果是用C++开发,更推荐使用std::vector或std::array这类容器,它们自带获取长度的成员函数,无需手动处理:

#include <vector>
#include <string>
#include <cstdio>

using namespace std;

int main() {
  vector<string> options = {"Option1", "Option2", "Option3"};
  vector<string> options2 = {"Option1", "Option2"};
  vector<string> *p;

  if (true) {
    p = &options;
  } else {
    p = &options2;
  }

  printf("%zu\n", p->size()); // 根据条件输出3或2
  return 0;
}

为什么原代码最后一行输出1?

当数组名赋值给指针p时,数组会退化为指向首元素的指针,此时sizeof(p)获取的是指针本身的大小(64位系统为8字节),sizeof(p[0])是const char*类型的大小(同样是8字节),所以8/8=1,自然无法得到数组的真实长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:40:50