[英]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.