C语言结构体数组,输出中加取地址符是为什么?

#include<stdio.h>
void main()
{
struct stTest
{
int iNum;
char chLetter[6];
}
stAlpha[2]={2,"abcde",4,"EDCB"};
printf("%s,%s\n",&stAlpha[0].chLetter[2],stAlpha[1].chLetter[2]);
getch();
}

stAlpha[2]是一个struct stTest类的结构数组,元素为2个,
stAlpha[0].chLetter[2]指的是这个结构数组的第一个元素里面的字符数组成员chletter的第三个字符也就是‘c’,而printf 中的%s的参数对应的只能是一个字符串的指针(也就是一个字符串的首地址),%s必须对应一个地址,所以必须stAlpha[0].chLetter[2]前面加一个取地址符&,第二个stAlpha[1].chLetter[2]前面也应该加一个取地址符。
输出结果是:cde,CB
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-02-05

    取地址符&作为一元运算符,结果是右操作对象的地址。例如&x返回x的地址。地址本身是一个抽象的概念,用于表示对象在存储器中的逻辑位置。
    scanf("%d,%d",&x,&y);这里的&x表示x的地址,&y表示y的地址。scanf接收地址,然后把键盘(更确切地说是stdin输入流缓冲区)读入的信息按格式字符串的形式处理后存放到接收到的地址中。对于纯C来说,函数的参数是只能值参而不是变参,函数内部对参数的改变只影响参数本身而不影响调用函数时的实际参数(换句话说函数内部的只是副本)。所以这里不能向scanf传递x本身,需要用地址&x指明需要存放的位置,才能把值存到x中。

    输出中使用&,例如printf("%X",&a); 作用就是把变量a的物理地址用16进制的方式输出。

第2个回答  2012-12-28
stAlpha[0].chLetter 表示第一个结构体中字符数组的首地址,再加上[2]就表示字符数组中的第3个字符,所以要再加上取址符来传给printf函数一个地址了。
写成这样就可以不加取址符了。
printf("%s,%s\n",stAlpha[0].chLetter+2,stAlpha[1].chLetter+2);
第3个回答  2012-12-28
%c必须是一个字符,不是字符指针(如 char a)
%s 必须是一个字符指针,(如 char* a)
字符数组chLetter[2]的意思是 *(chLetter+2),代表着一个字符,取它的地址才能用%s

还有疑问请继续追问,满意请采纳,谢谢
第4个回答  2012-12-28
弄清楚操作符优先级,就知道上面的printf和这个是一样的

printf("%s,%s\n", &(stAlpha[0].chLetter[2]), &(stAlpha[1].chLetter[2]));

这句看得懂吧, 取"abcde"中第3个元素的地址和"EDCB"中第3个元素的地址用作输出, %s是输出字符串, 需要char *做参数
相似回答