C - 可以改变位置吗?

时间:2017-10-20 08:05:20

标签: c function loops pointers memory-address

我是该语言的新手,正在尝试一个简单的代码。我想尝试创建一个基于指针的循环。但似乎你不能像汇编程序那样提升variate位置。或者我只是做错了?如果我真的不能强迫新的变量出生在特定的位置?那是我的代码

#include <stdio.h>

int main(void) {
    int firstnumber = 1;
    int *beginning = &firstnumber;
    printf("%i %i \n",firstnumber,beginning);
    Test1(firstnumber,beginning);
    return 0;
}

Test1 (int num, int begin)
{
    int reserve = num;
    if(num != 100)
    {
        &num +=2;
        num = (reserve+1);
        return Test1(num, begin);

    }
    else
    {
        int assist = begin;
        while(*assist != 100)
        {
            printf("/n \n %i %i \n /n",num,assist);
            &assist += 2;
        }
    }
}

我知道这可能看起来很荒谬,但我真的很好奇

3 个答案:

答案 0 :(得分:0)

不,您无法宣传/更改变量位置。

所以这个:

int num;
&num +=2;

没有意义,会导致错误:

error: lvalue required as left operand of assignment
         &num +=2;
              ^~

同样的:

int assist;
&assist += 2;

只有修改了这些语句才会编译代码(但现在逻辑已经改变,你应该继续),但现在它会导致无限循环,因为你的函数永远不会返回else案例中:

#include <stdio.h>

void Test1 (int num, int* begin);

int main(void) {
    int firstnumber = 1;
    int *beginning = &firstnumber;
    printf("%i %i \n",firstnumber, *beginning);
    Test1(firstnumber, beginning);
    return 0;
}

void Test1 (int num, int* begin)
{
    int reserve = num;
    if(num != 100)
    {
        num +=2;
        num = reserve + 1;
        return Test1(num, begin);

    }
    else
    {
        int assist = *begin;
        while(assist != 100)
        {
            printf("/n \n %i %i \n /n",num,assist);
            assist += 2;
        }
    }
}
祝你好运!

答案 1 :(得分:0)

你正在考虑倒退。指针是您可以移动的变量,因此请将它们用于您想要移动的任何内容。

firstnumber是一个整型变量 - 编译器决定它的存储位置,你不能告诉编译器将名称firstnumber重新绑定到另一个位置。但是,您可以根据需要移动指针。所以,

void Test1(int num) {
    &num +=2;
    num = 42;
}

是胡说八道,但是

void Test2(int *num) {
    num += 2;
    *num = 42;
}

很好 - 只要 num+2仍然是有效的分配对象。例如,您可以将其称为

int i[5];
Test2(i); /* sets i[2] = 42 */

(如果传入少于3个整数的数组,则会出现运行时错误而不是编译错误,因为Test2会损坏您的堆栈帧或其他不应该触及的内存。< / p>

答案 2 :(得分:0)

好的,我更深入地检查了代码并得出了几个结论:

函数变量不能继承他的祖先地址。因此,除非我使用一些静态变量

,否则使用该任务的函数是无用的

我得到了另一个结论,但我不记得它是什么。抱歉,谢谢你的时间