C语言指针练习:如何获取指针指向元素在原数组中的对应位置
核心错误原因
- 起始位置计算逻辑错误:
startPos[i]本身就是指向names数组中第i个姓名首字符的指针,要得到该姓名在数组中的起始下标,直接计算两个指针的偏移量startPos[i] - names即可。原有代码中names[*startPos[i]]是先取首字符的ASCII值,再将该ASCII值作为下标取names数组的元素,输出结果自然不符合预期。 - 长度计算逻辑错误:姓名区间的长度等于相邻两个起始指针的差值,直接用
startPos[i+1] - startPos[i]即可得到。原有代码是对两个指针指向的字符的ASCII值做减法,计算逻辑完全错误。
修正后代码
void printNames(char names[], char *startPos[], int nrNames){ for(int i = 0; i < nrNames; i++){ printf("startPos[%d]=%02d length=%02d string=\"%s\"\n", i, (int)(startPos[i] - names), (int)(startPos[i+1] - startPos[i]), startPos[i]); } }
补充说明
指针相减的返回值为ptrdiff_t类型,此处强转为int匹配%d的格式要求,练习场景下完全适用。该实现默认startPos数组长度为nrNames + 1,最后一个元素指向所有姓名存储的结束位置,是这类紧凑字符串存储结构的常规设计,刚好满足最后一个姓名的长度计算需求。
内容的提问来源于stack exchange,提问作者issoCoder
相关产品推荐
相关产品推荐

