gpt4 book ai didi

char ** 和解引用指针

转载 作者:太空狗 更新时间:2023-10-29 16:42:48 25 4
gpt4 key购买 nike

我想结束对 char **

的困惑

一旦创建了一个字符数组(字符串)数组,char ** 实际上是如何实现的?

我知道 char * 是一个指向 char 的指针,而 char *array[] 是一个 char 指针数组,但是 char 到底是做什么的** 做以及它是如何做的?

此外,当我听到取消引用这个词时,我会觉得指针已被删除。取消引用指针到底是什么意思?改变指针指向的值?

谢谢

最佳答案

“取消引用”指针意味着访问指针指向的值。假设以下声明:

int a = 10;
int *p = &a;

这是两个变量的假设内存映射:

Item      Address      0x00  0x01  0x02  0x03----      -------      ----  ----  ----  ----   a      0x80001000   0x00  0x00  0x00  0x0A   p      0x80001004   0x80  0x00  0x10  0x00

a contains the integer value 10. p contains the address of a (0x80001000). If we want to access the contents of a through p, we dereference p with the indirection operator *. Thus, the expression *p is equivalent to the expression a. If we wrote

 *p = 16;

这和写是一样的

  a = 16;

下面是一小段代码,展示了如何使用 char ** 类型的对象来创建字符串数组:

#include <stdlib.h>
#define N 20 // For this example, we will allocate 20 strings
#define LENGTH 10 // of 10 characters each (not counting 0 terminator)
...
char **arr = malloc(sizeof *arr * N);
if (arr)
{
size_t i;
for (i = 0; i < N; i++)
{
arr[i] = malloc(sizeof *arr[i] * (LENGTH + 1));
strcpy(arr[i], " ");
}
}

逐行检查,

char **arr = malloc(sizeof *arr * N); 

分配一个包含 N 个元素的 block ,每个元素都足够大以存储指向 char 的指针 (sizeof *arr == sizeof (char *) since type of *arr == char *),并将结果指针值赋给 arr。 IOW,arr 指向指向 char 的第一个指针,因此类型为 char **。请注意,如果将声明和函数调用分开,它看起来像

char **arr;
...
arr = malloc(sizeof *arr * N);

我们想将 malloc 的结果分配给 arr,而不是分配给 arr 指向 的内容。

if (arr)

malloc 有可能失败,所以我们要在使用前检查结果。如果 malloc 失败,它将返回 NULL 指针值。

{
size_t i;
for (i = 0; i < N; i++)
{
arr[i] = malloc(sizeof *arr[i] * (LENGTH + 1));

对于每个字符指针arr[i],我们分配一个足够大的内存块用于 LENGTH+1 个元素,每个元素大到足以容纳一个 char 值(sizeof *arr[i] == sizeof (char),因为 *arr[i] == char 的类型;请注意 sizeof (char) 始终为 1) 并将结果分配给 arr[i]

由于我们使用单独的 malloc 调用分配每个字符串,因此它们在内存中不太可能是连续的。这是另一个内存映射,显示了上述代码的可能结果:

Item         Address        0x00  0x01  0x02  0x03----         -------        ----  ----  ----  ---- arr         0x80001000     0xA0  0xCC  0x00  0x00               ... arr[0]      0xA0CC0000     0xA0  0xCC  0x20  0x00      arr[1]      0xA0CC0004     0xA0  0xCC  0x20  0x40 arr[2]      0xA0CC0008     0xA0  0xCC  0x21  0x28             ... arr[19]     0xA0CC0014     0xA0  0xCC  0x23  0x10             ... arr[0][0]   0xA0CC2000     ' '   ' '   ' '   ' ' arr[0][4]   0xA0CC2004     ' '   ' '   ' '   ' ' arr[0][8]   0xA0CC2008     ' '   ' '   0x00  0x??             ... arr[1][0]   0xA0CC2040     ' '   ' '   ' '   ' ' arr[1][4]   0xA0CC2044     ' '   ' '   ' '   ' ' arr[1][8]   0xA0CC2048     ' '   ' '   0x00  0x??             ...

关于char ** 和解引用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com