3

我试图了解数组和指针之间存在的特殊关系,即不带括号的数组名称始终指向数组的第一个元素。

在 Linux 系统上,我通过 C 程序得到这个:

char name[7] = "unique";

printf("\nAddress stored of name: %p", name); 
printf("\nAddress stored of name: %s", name); //Conflict
printf("\nAddress of name[0]: %p", &name[0]);

//dereferencing the pointer
printf("\nValue of name[0]: %c", *name);
printf("\nValue of name[1]: %c", *(name+1));

输出是:

Address stored of name: 0xbff68131
Address stored of name: unique
Address of name[0]: 0xbff68131
Value of name[0]: u
Value of name[1]: n

我理解上述输出中的所有内容,但代码行的输出为//Conflict。换句话说,如果根据数组和指针之间的特殊关系, name等价于&name[0],那么为什么简单地更改格式说明符(从 %p 到 %s)会打印出数组的实际值。如果确实如此,那么这是否意味着name&name[0]*name都是等价的?

我至少希望它(//冲突)打印一些其他(垃圾?)值,而不是数组的实际值。

4

2 回答 2

2
%s

这告诉printf将参数视为指向包含字符数组的内存位置的指针,并打印每个字符,直到\0遇到。

%p

如您所见,这会将争论视为内存位置并以十六进制打印其值。

您所说的“冲突”实际上是迄今为止更重要的用途,并且是打印 c 字符串的正确方法。

于 2013-03-05T02:52:50.657 回答
-1

当使用数组表达式代替指针表达式时,数组表达式将转换为指向第一个元素的指针。指向第一个元素的指针是array+0or &array[0],第一个元素是*(array+0)or array[0]

printf("\nAddress stored of name: %p", name);中,数组表达式被转换为指向第一个元素的指针。同样对于printf("\nAddress stored of name: %s", name);, name 被转换为指向 的指针name[0]。添加 1 会导致指向 的指针name[1]。添加 2 会导致指向name[2]等的指针。

值得注意的是,array[n]运算符实际上是一个pointer[n]运算符,它array被转换为指向第一个表达式的指针。n 被添加到指针以产生指向第 n 个元素的指针,然后取消引用以从其指针中产生第 n 个元素。这是%s格式说明符的结果。但是,%p格式说明符根本不做任何解除引用。

如果确实如此,那么这是否意味着 name、&name[0] 和 *name 都是等价的?

No.name是一个数组表达式:sizeof name将导致 7.&name[0]是一个指针表达式,转换为“指向 name[0] 的指针”:sizeof &name[0]将导致sizeof (char *). *name是一个 char 表达式,翻译为“名称指向的 char”。sizeof *name将导致 1。

于 2013-03-05T03:14:07.373 回答