我们说我有
char *names[] = { "Tom", "Jerry" };
我想打印" e"在" Jerry"使用printf
。我的第一直觉是
printf("%c\n", *names[5]);
但是当我应用我已经学过的关于指针的东西时,我意识到这是完全垃圾代码,因为5指的是names
中不存在的第五个指针,而不是" e&#34 ;在" Jerry"。 names
中包含的指针只会引用各自字符串中第一个字符的内存地址。
所以我真正需要做的是向names[1]
添加一个字节指向,然后打印" e"在" Jerry"。但我不确定如何做到这一点,或者它是否在C中被允许。
实现这一目标的最佳方法是什么?提前谢谢。
答案 0 :(得分:6)
我认为你要找的是printf("%c\n", names[1][1]);
。
答案 1 :(得分:6)
问题是你没有拥有一个多维数组,你有一个包含数组指针的单维数组。
在内存中,您的数组看起来像这样:
+----------+----------+ | names[0] | names[1] | +----------+----------+ | | | V | +---------+ | | "Jerry" | | +---------+ V +-------+ | "Tom" | +-------+
上面的图片应该清楚地说明当你执行*names[5]
时,首先必须记住编译器将其解析为*(names[5])
,这意味着你试图取消引用数组中的第六个条目只有两个条目。这将导致undefined behavior。
答案 2 :(得分:2)
取第二个字符串:names[1]
,添加一个指向第二个字符:names[1]+1
,并取消引用以获取您指向的内容:*(names[1]+1)
,也等于{{ 1}}
names[1][1]
答案 3 :(得分:1)
将j
字符串的i
字符作为(0-indexed)访问:
names[i][j];
答案 4 :(得分:1)
names[ nameIndex ][ characterIndex ]
所以,如果你想打印" e" " Jerry" :
printf("%c\n", names[1][1]);
或者" m"汤姆" :printf("%c\n", names[0][2]);
答案 5 :(得分:0)
使用指针打印'e'(值的第二个字符)Jerry(数组中的第二个值)的最佳方法是*(array [1] +1)(1表示第二个值和char,因为我们从0开始在c)