C - 可以提升变量位置吗?

标签 c function loops pointers memory-address

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

#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;
        }
    }
}

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

最佳答案

你在逆向思考这个问题。指针是您可以移动的变量,因此将它们用于您想要移动的任何内容。

firstnumber 是一个整型变量 - 编译器决定它的存储位置,并且您不能告诉编译器将名称 firstnumber 重新绑定(bind)到其他位置。不过,您可以随意移动指针。所以,

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 会损坏您的堆栈帧或其他不应触及的内存)。

关于C - 可以提升变量位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46844792/

相关文章:

c - 在c中用strlen验证

c - 为什么第一个代码中没有使用 "&"运算符?

c - 如何在 C 中对不同文件的列求和?

char数组到C中的LPCTSTR转换

c - 串行 c 在 linux 中读取有问题

php - 快速 OOP 问题 - PHP

function - 如何修复此 Haskell 查找函数类型不匹配?

c++ - 在 C++ 中使用变量的值来引用变量的名称

c# - 如何在 c sharp 中的每个循环中跳过 a 中的特定位置?

php - SilverStripe 3 - <% loop %> 选项