c-char数组和指针——有人能解释下面的输出吗



我试图理解数组和指针之间存在的特殊关系,即没有括号的数组名称总是指向数组的第一个元素。

在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是否都等效?

我至少希望它(//Conflict(打印一些其他(垃圾?(值,但不打印数组的实际值。

%s

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

%p

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

你所说的"冲突"实际上是更重要的用途,也是打印c字符串的正确方法。

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

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

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

如果真的是这样的话,那么这意味着名字吗;名称[0]和*名字都是对等的吗?

没有。name是一个数组表达式:sizeof name将得到7。&name[0]是一个指针表达式,翻译为"指向名称[0]的指针":sizeof &name[0]将产生sizeof (char *)*name是一个字符表达式,翻译为"名称指向的字符"。CCD_ 23将得到1。

最新更新