C语言中,(ptr == &ptr)是什么意思?*ptr是什么?

3

这可能是一个愚蠢的问题,但是我对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");
}

这怎么可能呢?'ptr'指向的地址是&ptr,而ptr的内容与&ptr相同。那么为什么*ptr = 10呢?


5
最重要的是,ptr这个称呼不准确,因为它并不是指针,而是一个数组。 - sbi
@sbi 在这种情况下,名称“ptr”取决于上下文。在&ptr == ptr中,ptr是左操作数中的数组(&的结果给出一个指向数组的指针)。右操作数是一个指针,它与&ptr[0]相同。Ptr本身是一个数组,而不是一个指针。 - nos
2
@nos:不,它不是两者兼备的。当在该表达式中使用时,它会衰减为指针,但它本身并不是指针。 - sbi
4
这句话的意思是:这就像说5既是整数又是浮点数,因为你可以这样做:double x = 5;。而ptr只是一个数组,只有通过转换才能变成其他类型。请注意,这里的翻译并没有改变原意。 - GManNickG
1
if (&ptr == ptr) 不是有效的 C 语言。char (*)[100] 不能隐式转换为 char * 或反之。在理想的情况下,编译器会拒绝这段代码,但它可能至少会发出警告。整个问题在于,&ptrptr类型 上不同,而不是数值上的差异。 - R.. GitHub STOP HELPING ICE
3个回答

5

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

除非它是 sizeof 或取地址符 & 的操作数,或者是被用于在声明中初始化另一个数组的字符串字面值,否则类型为 "N 个元素的 T 数组" 的表达式将会隐式转换("衰变")为类型 "指向 T 的指针",并且该值将是数组中第一个元素的地址。

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

给定以下声明:

T a[N];

如果以下内容都是真的,则:
表达式 类型 衰变为 ---------- ---- --------- a T [N] T * &a T (*)[N] 不适用 *a T 不适用
表达式 a&a 都求值为相同的(数组中第一个元素的位置),但类型不同(分别为指向 T 的指针和指向 T 数组的指针)。

我相当肯定你是指第N个元素,但我不完全确定,请你澄清一下吗?(在表格下方的文字中有更多内容) - Penguin9

3

ptr(正如sbi所说,实际上是一个数组)会退化为&(ptr[0])(指向第一个元素的char *类型)。

尽管它们是不同类型的,但这与&ptrchar (*) [])是相同的地址。


1
但它们的类型不同。ptr是一个char,&ptr是一个char()[100]。 - nos
2
@nos:对象 ptr 是一个由100个char元素组成的数组。表达式 ptr 的类型是char [100],当它出现在printf调用中时,会隐式转换为类型char * - John Bode

0
    int arr[5];
    arr[0]= 7;

    fprintf(stdout,"%p %p %d",&arr[0],arr,*arr);

    if( (int)&arr == (int)arr ) printf("good\n");
    else printf("bad\n");
    return 0;

}

这个会起作用…..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接