我正在学习C语言的指针。我已经编写了一个简单的指针代码。我没有错误,但程序iz
在执行过程中冻结。可能是什么原因?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void main()
{
int i;
int *i2;
i2 = &i;
int z;
int *z2;
z2 = &z;
int b = 0;
int *b2;
b2 = &b;
char ch[250];
//char *ch2;
//ch2 = &ch;
printf("%s\n", " Enter line not longer than 250 characters");
gets_s(ch);
for (*i2 = 0; *i2<10; i2++)
{
if (*i2>4)
{
*z2 = *i2;
*b2++;
break;
}
}
printf("%d%c", *b2, ch[*z2]);
}
答案 0 :(得分:5)
一个很大的问题是你的for
循环:
for (*i2 = 0; *i2<10; i2++)
i2++
增加指针的值(使其指向i
以外的其他内容),而不是指向的内容。您需要将该行更改为
for (*i2 = 0; *i2<10; (*i2)++)
*i2
周围的括号是必要的,因为后缀++
运算符的优先级高于一元*
运算符。 *i2++
将被解析为*(i2++)
,这不是您想要的。
答案 1 :(得分:4)
for (*i2 = 0; *i2<10; i2++)
应该是
for (*i2 = 0; *i2<10; (*i2)++)
注意:强>
使用main()
int main(void) //if no command line arguments.
答案 2 :(得分:2)
当您编辑原始问题时,您问了第二个问题(编辑现已被撤消,因此实际问题已消失)。
基本上你问为什么printf语句没有返回预期的值。 那时你有这个代码:
Thread thread = new Thread()
{
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run()
{
try
{
Document doc = Jsoup.connect("http://terry.gonguet.com/cal/?g=tp11").get();
Elements days = doc.select("div.day");
for (Element day : days)
{
String jour = day.getElementsByClass("dayDate").first().html();
mSectionsPagerAdapter.AddFragment(new MainFragment().newInstance(1), jour);
}
}catch (IOException ex){}
}
});
}
};
thread.start();
b2是指针... int * b2;
现在为b2指定一个值... b2 =&amp; b;
所以现在b2包含地址b,你的printf语句打印这个地址(虽然是整数格式'%d'而不是指针%p)
要获得“b”指向'b''所持有的值,您需要取消引用... * b2
但是......请注意,您已使用此语句更改了指针* b2 ... * b2 ++
该语句改变了指针的值,而不是它最初指向的b的值,现在* b2将是未定义的。
将* b2 ++更改为(* b2)++并将printf b2更改为printf * b2
结果是b + 1,当b最初设置为0时,它将为1。