C语言中如何通过双指针访问数组元素?RPN计算器参数访问求助
首先,我注意到你当前的函数参数和调用可能存在类型不匹配的问题,这也是你无法正确获取数组长度、遍历元素的核心原因。咱们一步步拆解:
先搞清楚你的参数到底是什么
你定义的函数参数是const char** input,这是一个指向字符指针的指针,通常用来传递字符串数组(比如多个独立的字符串组成的数组),而不是单个字符数组(单个字符串)。如果你传入的input1是单个字符数组(比如char input1[] = "123+4*"),那直接传递给const char**类型的参数会导致类型不兼容,*input的取值会出现错误,自然strlen(*input)也得不到正确结果。
分两种情况解决你的问题
情况1:你想传递单个字符数组(字符串)给函数
这时候应该把函数参数改成const char* input(单个字符指针,对应单个字符串),然后用双指针遍历就很简单了:
#include <stdio.h> #include <string.h> int RPN_calculator(const char* input) { // 获取字符串长度(注意用size_t类型更安全,strlen返回size_t) size_t str_len = strlen(input); printf("LENGTH OF INPUT: %zu\n", str_len); // 双指针遍历字符串的方式:一个指向开头,一个指向末尾的下一个位置 const char* start_ptr = input; const char* end_ptr = input + str_len; // 从前往后遍历每个字符 while (start_ptr < end_ptr) { printf("当前字符:%c\n", *start_ptr); // 指针后移,访问下一个元素 start_ptr++; } // 如果你需要从两头往中间遍历(比如逆序或者查找),可以这样: // start_ptr = input; // end_ptr = input + str_len - 1; // while (start_ptr <= end_ptr) { // printf("头:%c,尾:%c\n", *start_ptr, *end_ptr); // start_ptr++; // end_ptr--; // } return 0; } // 调用示例 int main() { char input1[] = "3 4 + 2 *"; RPN_calculator(input1); return 0; }
这里的双指针思路是:用start_ptr标记当前访问的位置,end_ptr作为遍历的边界,通过移动指针来逐个访问数组元素,完全不需要使用下标。
情况2:你确实需要传递字符串数组(多个RPN表达式)
如果input1是多个字符串组成的数组(比如const char* input1[] = {"1 2 +", "3 4 * 5 -"}),那你的const char** input参数是对的,但要注意:无法通过指针直接获取字符串数组的长度,必须额外传递一个参数来告知数组元素的个数。示例代码如下:
#include <stdio.h> #include <string.h> int RPN_calculator(const char** input, size_t array_len) { // 遍历字符串数组中的每个字符串 for (size_t i = 0; i < array_len; i++) { const char* current_str = input[i]; size_t str_len = strlen(current_str); printf("第%zu个表达式,长度:%zu\n", i+1, str_len); // 用双指针遍历当前字符串的每个字符 const char* start_ptr = current_str; const char* end_ptr = current_str + str_len; while (start_ptr < end_ptr) { printf(" 字符:%c\n", *start_ptr); start_ptr++; } } return 0; } // 调用示例 int main() { const char* input1[] = {"3 4 +", "5 2 * 7 -"}; // 计算字符串数组的元素个数 size_t input_len = sizeof(input1) / sizeof(input1[0]); RPN_calculator(input1, input_len); return 0; }
总结一下你之前的问题
你之前的代码里用strlen(*input),如果传入的是单个字符数组,*input的实际取值是错误的(因为类型不匹配),所以得到的长度不对,遍历自然也失败。先明确你要传递的是单个字符串还是字符串数组,调整参数后,双指针遍历的逻辑就清晰了。
内容的提问来源于stack exchange,提问作者Jesse Potts

