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?
您的代码包含很多错误,但如果您的问题正是我引用的内容,一个简单的答案是:
pos
是 sentence
字符串中的指针。开始指向 sentence
指向的位置并移开以到达字符串的末尾。
position()
取一个起点end return找到letter
的点,否则就是returnNULL
:所以当你写pos = position (letter, pos);
pos
移动到 letter
位置。之后通过 pos +=1;
移动到下一个元素(移动一个字符的指针)。
当有任意字母position()
returnNULL
和while
循环终止。
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 函数完成。
在这段代码中,我除了 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?
您的代码包含很多错误,但如果您的问题正是我引用的内容,一个简单的答案是:
pos
是 sentence
字符串中的指针。开始指向 sentence
指向的位置并移开以到达字符串的末尾。
position()
取一个起点end return找到letter
的点,否则就是returnNULL
:所以当你写pos = position (letter, pos);
pos
移动到 letter
位置。之后通过 pos +=1;
移动到下一个元素(移动一个字符的指针)。
当有任意字母position()
returnNULL
和while
循环终止。
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 函数完成。