回覆列表
  • 1 # tolhh2150

    根據引數型別以及函式實現的功能綜合判斷。注意不能單單看是否為指標。 要傳遞型別為A的值,如果引數型別是A*,那麼為傳地址,反之,如果引數型別是A,那麼是傳值。比如,要傳遞int型引數:

    1 傳值:void func(int a);

    2 傳地址:void func(int *a);而傳遞char *型引數。1 傳值:void func(char *a);2 傳地址:void func(char **a);同樣是char *型別的引數,有可能是傳值,也有可能是傳地址。具體取決於函式實現功能。

  • 2 # 使用者7561284500298

    不用多想,看看下面這個c函式編譯出來的彙編檔案是怎麼樣就可以了:

    編譯:

    生成的彙編檔案如下:

    riscv32體系結構呼叫協定中,用暫存器a0至a7傳遞引數,用暫存器a0或{a1, a0}傳遞返回值。

    f中的兩條sw指令將a0和a1存入堆疊,也就是區域性變數a和b;

    然後先取區域性變數a的值存入暫存器a5,並判斷a5是否為假,如果為假就跳轉到.L2(不再判斷區域性變數b)。否則,繼續取區域性變數b的值存入暫存器a5,再判斷是否為假,如果為假仍然跳轉到.L2。否則,利用a5暫存返回值1,並跳轉到.L3;

    .L2利用a5暫存返回值0,並執行.L3;

    .L3將暫存返回值暫存器a5的值存入返回值暫存器a0,釋放當前棧幀並返回。

    c語言的種種規則只是一份標準檔案,背誦標準檔案不如看看被固化為程式的標準檔案(編譯器)對輸入的行為。

  • 中秋節和大豐收的關聯?
  • 我家寶寶一歲八個月了連續3天發燒,吃藥,打點滴都不見效?