c - 数组到指针与二维数组

标签 c arrays pointers

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

  1. 所以根据我的代码,我们可以使用指针数组来做到这一点,但是对于单个数组,我们不能这样做。为什么我们不能将多个字符串分配给没有指针的一维数组?

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

最佳答案

每个字符串文字 "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 中。 ,而不是字符串本身的副本。字符串文字不可修改(尝试这样做会调用未定义的行为);如果您希望能够修改字符串内容,请使用我上面显示的二维数组声明。

编辑

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

"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 ,而"world"存储在地址 0x8006 。字符数组arr存储在地址 0xff00并包含字符串 "hello"副本 。指针p存储在地址 0xff08并存储字符串文字 "world" 的第一个字符的地址 。你应该能够算出parr (这几乎就是您的原始代码片段正在做的事情)。

关于c - 数组到指针与二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36824206/

相关文章:

c++ - 从 C 数组初始化 std::array 的正确方法

java - 为什么我的网格没有从 'O' 更新到 'S'(数组)

c - 用于在网格上查找路径的最有效内存算法

c - 如何使用共享内存和信号量实现管道?

javascript - 我需要计算带有对象的数组中的列总和

c++ - (char *) (msg +1) 这个 +1 带我们去哪里?

c - 指针作为一个数组的索引 - C

Python ctypes 用法传递指针

c - 有没有办法从一个队列出队并入队到另一个队列?

c - 将字符串初始化为 {0, } 有什么作用?