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

指针所需的基本帮助(双重间接)

发布时间:2020-12-16 10:39:22 所属栏目:百科 来源:网络整理
导读:我前段时间问过一个帐户,我不记得如何操纵基本指针,有人给了我一个非常好的演示 例如 char *ptr = "hello" (hello = a char array) 所以现在* ptr指向h ptr =移动ptr指向下一个元素,得到它的值我做* ptr,这给了我e 好吧到目前为止我希望:D但现在我需要操纵
我前段时间问过一个帐户,我不记得如何操纵基本指针,有人给了我一个非常好的演示

例如

char *ptr = "hello" (hello = a char array)

所以现在* ptr指向h

ptr =移动ptr指向下一个元素,得到它的值我做* ptr,这给了我e

好吧到目前为止我希望:D但现在我需要操纵一个char ** ptr并且想知道我是如何以一种模仿二维数组效果的方式做到这一点的?

一些基本技巧将非常受欢迎,因为我需要做一个有** ptr来模仿二维阵列的作业而不知道它是如何做到这首先意味着我甚至无法在纸上解决它(例如,你如何取消引用一个** ptr,你如何获得[x] [y]值等)

谢谢

解决方法

如果所有地址都已正确设置,您可以使用与下标数组相同的方式下标指针.

假设以下声明:

char **ptr;

以下是各种表达式的类型:

       Expression        Type      Equivalent expressions (yield same value)     
       ----------        ----      -----------------------------------------
              ptr        char **   &ptr[0]
             *ptr        char *    ptr[0] 
         *(ptr+i)        char *    ptr[i]; &ptr[i][0]
            **ptr        char      ptr[0][0]
      *(*(ptr+i))        char      ptr[i][0]; *ptr[i]
    *(*(ptr+i)+j)        char      ptr[i][j]

从而:

> ptr可以被视为一个字符串数组(2-d char数组)
> ptr [i]指向列表中第i个字符串的开头
> ptr [i] [j]是列表中第i个字符串的第j个字符的值
>表达式ptr和ptr将使ptr前进到指向下一个字符串
>表达式(* ptr)和(* ptr)将使* ptr前进到指向下一个字符

至于设置指针,这种安排假设所有内容都已经被分配为静态数组或动态地通过malloc.你不能只写

char **ptr = {"foo","bar","bletch"}; // using aggregate initializer on 
                                       // non-aggregate type; bad juju,// a.k.a undefined behavior

要么

char **ptr;          // ptr has not been initialized to point anywhere 
ptr[0] = "foo";      // dereferencing ptr via subscript invokes undefined
ptr[1] = "bar";      // behavior
ptr[2] = "bletch";

通常,当您使用指针时,就像它是一个数组一样,您将使用malloc或类似的东西来分配缓冲区:

char **ptr = malloc(sizeof *ptr * N);
if (ptr)
{
  ptr[0] = "foo";    // ptr[i] gets address of
  ptr[1] = "bar";    // string literal
  ptr[2] = "bletch";
  ...
}

要么

char **ptr = malloc(sizeof *ptr * N);
if (ptr)
{
  size_t i;
  for (i = 0; i < N; i++)
  {
    ptr[i] = malloc(sizeof *ptr[i] * M); // strictly speaking,the sizeof
    if (ptr[i])                          // is not necessary here
    {
      //initialize ptr[i]
    }
  }
}

(编辑:李大同)

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

    推荐文章
      热点阅读