C 指针和数组

C pointers and arrays

在这段代码中,我除了 main 之外还有一个函数,它在字符串(句子)中找到一个特定的字符,returns 一个指向它的指针,否则它 returns NULL:

char *position (char letter, char *sentence){
int i=0;
while (*(sentence+i) != '[=10=]') {
    if (toupper(*(sentence+i)) == toupper (letter))
      return (sentence+i);
    ++i;
}
return NULL;}

到这里我都清楚了。

并且在主函数中我必须使用前面的函数(位置)来查找特定字母在特定句子中出现了多少次。

int main (void){
char sentence [200+1];
char letter;
char *pos = sentence;
int counter=0;
gets(sentence);
scanf("%c", &letter);
while (pos != NULL){
    pos = position (letter, pos);
    if (pos != NULL){
        ++counter;
        pos +=1;
    }
}
return 0;   
}

我不清楚的是,一旦设置了 pos 变量,它到底是什么,最后的 while 循环究竟是如何工作的?

编辑:忘记在 function() 中初始化变量 i,感谢您指出

What is unclear to me is what is exactly in the pos variable once it is set and how exactly the while loop at the end works?

您的代码包含很多错误,但如果您的问题正是我引用的内容,一个简单的答案是:

possentence 字符串中的指针。开始指向 sentence 指向的位置并移开以到达字符串的末尾。

position()取一个起点end return找到letter的点,否则就是returnNULL:所以当你写pos = position (letter, pos); pos 移动到 letter 位置。之后通过 pos +=1; 移动到下一个元素(移动一个字符的指针)。 当有任意字母position()returnNULLwhile循环终止。

pos 使用 char *pos = sentence; 进行初始化,使其指向 sentence 中的第一个字符,因为数组 "decaying" 指向大多数表达式中的指针,例如这个。之后指向sentence里面的元素,因为position() returns sentence+i是句子第一个元素的地址加上偏移量i.

让我们做一个小例子:你有字符串 "abaab" 并且你正在寻找字母 b。如您所知,C 字符串总是以“\0”结尾。所以一开始你的 pos 代表整个字符串。

abaab[=10=] //pos represents ="abaab"
| 
pos

之后调用函数:postiton(pos, 'b')。 Pos 现在指向第二个字母。而这个pos只代表较小的String "baab".

abaab[=11=] //pos represents="baab"
 | 
pos

在++pos之后;你遇到这种情况:(pos代表一个较小的字符串)

abaab[=12=] //pos represents ="aab"
  | 
 pos

当您现在再次调用位置函数时。 pos会指向下一个'b'。当然,字符串又变短了。

abaab[=13=] //pos represents ="b"
    | 
   pos

增量位置:

abaab[=14=] //pos represents =""
     | 
    pos

再次调用位置函数将return NULL,因为没有'b'。当此函数 return 为 NULL 时,while 函数完成。