数组指针与2D数组

时间:2016-04-24 14:12:19

标签: c arrays pointers

char *string1[20] = { "hello", "world" };

  1. 所以基于我的代码,我们可以用指针数组来做这个,但是对于单个数组,我们不能这样做。为什么我们不能在没有指针的情况下将多个字符串分配给1d数组?

  2. 在1d数组中,我们能够访问字符串中的每一个char。 那么,是否可以访问string1的单个值(例如我想在“世界”中访问'o')?

3 个答案:

答案 0 :(得分:1)

是的,因为指针算法,可以将它用作2D数组:

#include <stdio.h>

int main() {
    char *str[20] = {"hello", "world"};

    printf("%c\n", str[1][1]);

    return 0;
}

答案 1 :(得分:1)

每个字符串文字"hello""world"都是char的数组,所以

char string1[20] = { "hello", "world" };

无效;它和写作一样

int foo = { 1, 2 }; 

你试图将2件物品存储到1个物体中。

你可以做几件不同的事情:

  • 您可以将一个字符串存储到string1
    char string1[20] = "hello"; // will copy the *contents* of "hello" into string1
  • 您可以两个字符串文字连接成一个字符串,然后将 存储在string1中:
    char string1[20] = "hello" " " "world"; // preprocessor concatenates adjacent string literals into a single string
  • 您可以将string1声明为char的二维数组:
    char string1[2][20] = { "hello", "world" }; // copies contents of "hello" to string1[0] and "world" to string1[1]

使用string1的当前声明,您可以访问每个字符串文字的单个字符:

char *string1[20] = { "hello", "world" };
...
putchar( string1[1][1] ); // writes 'o' to standard output

请注意,在这种情况下,您将在string1中存储指向字符串文字的指针,而不是字符串本身的副本。字符串文字不可修改(尝试这样做会调用未定义的行为);如果你想能够修改字符串内容,请使用我上面显示的2D数组声明。

修改

在这里回答问题而不是评论,因为它不适合那里。

"hello""world"是字符串文字;它们存储为char的数组,以便在程序启动时分配它们,并在程序退出时释放它们。两个文字都是“char的6元素数组”的表达式(5个字母加0个终止符)。

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N - T“的元素将被转换(”衰减“)为”指向T的指针“的表达式,表达式的值将是数组的第一个元素的地址。

示例:

char arr[6] = "hello";

这将arr分配为char的6个元素数组,并将字符串"hello"复制到其中;它与写作相同

char arr[6] = { 'h', 'e', 'l', 'l', 'o', 0 };

由于数组表达式"hello"用于初始化char的另一个数组,因此它不会转换为指针表达式。

char *p = "world"

在这种情况下,这会将p指定为char的指针;它存储单个char对象的地址。由于字符串文字"goodbye"不是sizeof或一元&运算符的操作数,因此它将转换为类型char *的表达式,以及表达式的值是字符串中第一个字符的地址。

char *parr[2] = { "hello", "world" };

只分配足够的空间两个存储两个指向char的指针,而不是两个字符数组。

如果我们查看上述所有内存映射,我们会得到一些看起来像这样的东西(地址是凭空而来的,不代表任何真实的平台;使用16位地址只是为了节省空间):

Item            Address       00  01  02  03
----            -------       --  --  --  --
"hello"         0x8000        'h' 'e' 'l' 'l'
"world"         0x8004        'o'  0  'w' 'o'
                0x8008        'r' 'l' 'd'  0   
                ...
arr             0xff00        'h' 'e' 'l' 'l'
                0xff04        'o'  0  ??  ??
p               0xff08        08  06  ??  ??
parr            0xff0c        08  00  08  06

字符串文字"hello"是地址0x8000的storead,而"world"存储在地址0x8006。字符数组arr存储在地址0xff00中,并包含字符串"hello"副本。指针p存储在地址0xff08,并存储字符串文字"world"的第一个字符的地址。您应该能够找出parr(这几乎就是您的原始代码段所做的事情)。

答案 2 :(得分:0)

是的,您可以直接访问它,如果您以前知道内部数组的大小,则可以使用通常的数组算法进行访问。

string1[1][1] == 'o'