#include
void main()
{
char w[][10]={"ABCD","EFGH","IGKL","MNOP"};
int k;
for(k=1;k<3;k++)
{
printf("%s",&w[k][k]);
}
}
w数组的存储结构:
- w 0x0013ff58
+ [0] 0x0013ff58 "ABCD" 第一行对应w[0],w[0][0]对应A,w[0][1]对应B,w[0][2]对应C,w[0][3]对应字符D,
+ [1] 0x0013ff62 "EFGH" 第二行对应w[1],w[1][0]对应E,w[1][1]对应F,w[1][2]对应G,w[1][3]对应字符H,
+ [2] 0x0013ff6c "IGKL" 第三行对应w[2]],w[2][0]对应E,w[2][1]对应F,w[2][2]对应G,w[2][3]对应字符H,
+ [3] 0x0013ff76 "MNOP" 第四行对应w[3]
k=1时,w[k][k]=w[1][1],由于前面&w[k][k]加了取地址符号&,所以此时是相当于一个指针,当以%s输出时,会输出以结束符\0为结束的字符串,w[1][1]对应第二行第二列,即&w[1][1]指向F对应的地址,此时printf("%s",&w[k][k]);以字符串输出,那么结果为FGH。
k=1时,w[k][k]=w[2][2],由于前面&w[k][k]加了取地址符号&,所以此时是相当于一个指针,当以%s输出时,会输出以结束符\0为结束的字符串,w[2][2]对应第三行第三列,即&w[2][2]指向K对应的地址,此时printf("%s",&w[k][k]);以字符串输出,那么结果为KL。
所以结果:FGHKL
应该是输出FGHKL吧,FGK我就没法解释了。
字符存储:
第0行:ABCD\0+5个垃圾值
第1行:EFGH\0+5个垃圾值
第2行:IJKL\0+5个垃圾值
第3行:MNOP\0+5个垃圾值
for循环执行两次,k为1时w[k][k]就是F,然后取地址作为一个字符串首地址匹配上%s,所以输出FGH;k为2时w[k][k]就是K,就输出了KL。
数组下标从0开始
第一个维度是字符串个数,这个数组有4个字符串
第二个维度是每个字符串最大长度
&w[k][k]表示取地址,w[1][1]为F,取地址打印的意思是打印字符串至'\0'字符
答案应该是FGH KL,
w[0]里面“ABCD”
w[1]里面“EFGH”
w[2]里面“IGKL”
w[3]李main“MNOP”
当k=1时,&w[1][1],输出FGH
当k=2时,&w[2][2],输出KL
数组使用下标访问的起始位是0 !
所以你打印的分别是:FGH KL