指针有什么问题

时间:2016-03-29 16:35:29

标签: c

我正在学习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]);
}

3 个答案:

答案 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。