指向字符串数组的指针数组

时间:2013-11-29 04:05:36

标签: c arrays string pointers

我们可以通过以下方式声明字符串数组:

char *words[] = { "abc", "def", "bad", "hello", "captain", "def", "abc", "goodbye" };

现在我有一个现有的字符串数组:

   char strings[4][20];
   strcpy(strings[0], "foo");
   strcpy(strings[1], "def");
   strcpy(strings[2], "bad");
   strcpy(strings[3], "hello");

我想做这样的事情:

   char *words[4];
   for ( j = 0; j < 4; j++)
   {
      words[j] = &strings[j];
   }

因此,单词的结构与我在开头时定义的结构相同。你们知道怎么做吗?

2 个答案:

答案 0 :(得分:3)

无需地址:

char *words[4];
for ( j = 0; j < 4; j++)
{
   words[j] = strings[j];
}

答案 1 :(得分:0)

char *words[] = { "abc", "def", "bad", "hello", "captain", "def", "abc", "goodbye" };

char *words[8];
words[0] = "abc";
words[1] = "def";
words[2] = "bad";
words[3] = "hello";
words[4] = "captain";
words[5] = "def";
words[6] = "abc";
words[7] = "goodbye";

是相同的事情。

在这两种情况下,words都是指向字符的指针数组。在C中,字符串是字符串指向字符的指针。同样的事情。

char *a[] = { "abc", "def", "bad", "hello", "captain", "def", "abc", "goodbye" };
char *b[8];
int i;
for (i = 0; i < 8; i++)
    b[i] = a[i];

也应该工作得很好。

您只需要记住那些是字符串文字,因此它们是只读的。它不是你可以修改的缓冲区。

即使你使用缓冲区,还有另外一点要注意:

char a[4][20];
char *b[4];
int i;

strcpy(a[0], "foo");
strcpy(a[1], "def");
strcpy(a[2], "bad");
strcpy(a[3], "hello");

for (i = 0; i < 4; i++)
    b[i] = a[i];

strcpy(b[0], "not foo");

printf("%s", a[0]);
// prints "not foo"

通过修改b中的字符串,您修改了a中的字符串,因为当您执行b[i] = a[i]时,您没有复制字符串,只有指针,内存地址在其中存储