如何使用printf从字符串数组中打印单个字符?

比方说我有

char *names[] = { "Tom", "Jerry" }; 

我想用printf打印“杰里”中的“e”。 我的第一直觉是

 printf("%c\n", *names[5]); 

但当我应用我一直在学习的指针时,我意识到这是完全垃圾代码,因为5指的是names不存在的第五个指针,而不是“Jerry”中的“e”。 names包含的指针只会引用各自字符串中第一个字符的内存地址。

因此,我真正需要做的是在names[1]添加一个字节以指向,并在“Jerry”中打印“e”。 但我不确定如何做到这一点,或者它是否在C中被允许。

完成此任务的最佳方法是什么? 先感谢您。

我认为你要找的是printf("%c\n", names[1][1]);

问题是你没有多维数组,你有一个包含数组指针的单维数组。

在内存中,您的数组看起来像这样:

 + ---------- + ---------- +
 | 名字[0] | 名字[1] |
 + ---------- + ---------- +
   |  |
   |  V
   |  + --------- +
   |  |  “杰里”|
   |  + --------- +
   V
   + ------- +
   |  “汤姆”|
   + ------- +

上面的图像应该清楚地表明,当你执行*names[5]你首先必须记住编译器将其解析为*(names[5]) ,这意味着你试图取消引用数组中的第六个条目只有两个条目。 这将导致不确定的行为

取第二个字符串: names[1] ,添加一个指向第二个字符: names[1]+1 ,并取消引用以获得您指向的内容: *(names[1]+1) ,这也等于names[1][1]

 names[1] -----v names[1]+0 ---v v "Jerry" ^ names[1]+1 ----^ *(names[1]+1) == 'e' names[1][1] == 'e' 

访问第i个字符串的第j个字符为(0-indexed): names[i][j];

names[ nameIndex ][ characterIndex ]所以如果你想打印“杰里”的“e”: printf("%c\n", names[1][1]); 或“汤姆”的“m”: printf("%c\n", names[0][2]);

使用指针打印’e’(值的第二个字符)Jerry(数组中的第二个值)的最佳方法是*(array [1] +1)(1表示第二个值和char,因为我们从c开始为0)