如何通过指向指针的指针获取字符串数组的元素个数
问题解决:通过指针获取数组元素个数
你遇到的核心问题是:数组赋值给指针后会退化为指针,丢失了原数组的长度信息,所以无法仅通过指针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
相关产品推荐
相关产品推荐

