簡體   English   中英

需要幫助來理解c中帶有指針和數組的代碼

[英]Need help to understand the code with pointers and arrays in c

我需要了解注釋行的作用嗎?

#include <stdio.h>
void fun(char**);

int main()
{
    char *argv[] = {"ab", "cd", "ef", "gh"};
    fun(argv);
    return 0;
}
void fun(char **p)
{
    char *t;
    t = (p+= sizeof(int))[-1]; //what this line does? //[-1] does what?
    printf("%s\n", t);
}

假設int在您的計算機中為4個字節,則將sizeof(int)替換為4:

t = (p+= 4))[-1];

只是向前移動指針p 4個元素,向后移動1個元素,然后得到該元素。

在此示例中,數組具有4個元素,因此向前移動到末尾一個,然后向后移動到最后一個元素"gh"

幾點注意:

  • a[-1]只是*(a - 1)
  • 您需要確保在執行指針算術時,它們始終指向數組中的一個元素或指向末尾的一個元素。
  • 同樣,名稱argv也不是一個好主意,因為我們通常使用它來引用main的參數。

-1表示它轉到上一個項目:

x[-1]=*(x-1)

整行是

*(x+sizeof(int)-1)

sizeof(int)大概是4,所以該行等於:

*(x+4-1)=*(x+3)=x[3]="gh"

最初**p包含argv[0]元素的地址,即"ab"然后將其遞增2 (將int的大小指定為2個字節)。現在它指向"ef"然后將其遞減-1 .so最后指向"cd"因此它將t值打印為"cd"

注意:

由於C是與機器相關的語言,因此sizeof(int)可能返回不同的值。

上述程序的輸出將在Windows(Turbo C)中為cd,在Linux(GCC)中為gh。

為了更好地理解它,請在Windows(使用Turbo C編譯器)和Linux(GCC編譯器)中編譯並執行上述程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM