当一次创建一个字符数组(字符串)的数组时,char **实际上是如何实现的?
我得到这个char *是一个指向char的指针,并且char * array []是一个char指针数组,但是char **做了什么,它如何做呢?
另外当我听到dereferences这个词时,会让我觉得指针被删除,指针的意思是什么呢?改变指针指向的值?
谢谢
解决方法
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包含整数值10. p包含一个(0x80001000)的地址.如果我们要访问一个通过p的内容,我们使用间接运算符*解除引用p.因此,表达式* p等价于表达式a.如果我们写的
*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个元素的块,每个块大到足以存储指向char(sizeof * arr == sizeof(char *)的指针,因为* 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?? ...