C - (ptr = =&ptr)什么是*ptr?

jfr*_*eax 3 c arrays pointers

这可能是一个愚蠢的问题,但我对C指针的理解有点问题.在阵列方面更是如此.例如:

char ptr[100];
ptr[0]=10;

fprintf(stderr, "&ptr: %p \n ptr: %p \n*ptr: %d\n", &ptr, ptr, *ptr);

if ( &ptr == ptr ) {
  fprintf(stderr, "Why?\n");
}
Run Code Online (Sandbox Code Playgroud)

这怎么可能呢?'ptr'位于adress&ptr.并且ptr的内容与&ptr相同.那为什么*ptr = 10 ???

Joh*_*ode 5

数组的第一个元素的地址与数组本身的地址相同.

除非它是sizeof&运算符地址的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则将隐式转换"N元素数组T"的表达式("衰减")键入"指向T的指针",该值将是数组中第一个元素的地址.

如果表达式a是"N元素数组T",那么表达式&a是"指向N元素数组T"的类型,或者T (*)[N].

鉴于声明

T a[N];
Run Code Online (Sandbox Code Playgroud)

那么以下都是真的:

Expression         Type        Decays to
----------         ----        ---------
         a         T [N]       T *
        &a         T (*)[N]    n/a
        *a         T           n/a

表达式a&a两者都计算相同的(数组中第一个元素的位置),但是具有不同的类型(指向T的指针和分别指向T的数组的指针).