加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

char **和取消引用指针

发布时间:2020-12-16 05:47:02 所属栏目:百科 来源:网络整理
导读:我想结束我的混淆与char ** 当一次创建一个字符数组(字符串)的数组时,char **实际上是如何实现的? 我得到这个char *是一个指向char的指针,并且char * array []是一个char指针数组,但是char **做了什么,它如何做呢? 另外当我听到dereferences这个词时,会让
我想结束我的混淆与char **

当一次创建一个字符数组(字符串)的数组时,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??
             ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读