【问题标题】:Using pointer to char array, values in that array can be accessed?使用指向 char 数组的指针,可以访问该数组中的值吗?
【发布时间】:2011-11-08 23:19:01
【问题描述】:

我创建了 ptr 作为指向 5 个字符数组的指针。

char (*ptr)[5];

为其分配了一个字符数组的地址。

char arr[5] = {'a','b','c','d','e'};
ptr = &arr;

使用指针 ptr 可以访问此数组中的 char 值吗?

printf("\nvalue:%c", *(ptr+0));

它不打印值。

在我的理解 ptr 将包含数组的基地址,但它实际上指向完整数组所需的内存(即 5 个字符)。因此,当 ptr 增加时,它会向前移动sizeof(char)*5 字节。那么是不是不能使用这个指向数组的指针来访问数组的值呢?

【问题讨论】:

  • 请记住接受对您的问题最有帮助的正确答案。您接受旁边带有勾号的问题。
  • 大家,请在发布答案之前阅读此c-faq.com/aryptr/ptrtoarray.html

标签: c pointers


【解决方案1】:

当你想访问一个元素时,你必须首先取消引用你的指针,然后索引你想要的元素(这也是取消引用)。即您需要这样做:

printf("\nvalue:%c", (*ptr)[0]);,与*((*ptr)+0)相同

请注意,使用指向数组的指针在 C 中并不常见。相反,只需使用指向数组中第一个元素的指针,并将长度作为单独的元素处理,或者在数组的结尾,因此可以知道数组何时结束,例如

char arr[5] = {'a','b','c','d','e',0}; 
char *ptr = arr; //same as char *ptr = &arr[0]

printf("\nvalue:%c", ptr[0]);

【讨论】:

  • 数组指针有其(有限的)用途,例如,当动态声明多维数组并且您希望相邻声明内存时,它们很有用。所以我不会完全解雇他们。但正如我们从这个线程中看到的那样,大多数 C 程序员对它们一无所知,因此仅此一项就是远离那时的理由。
【解决方案2】:

大多数响应的人似乎都不知道数组指针是什么......

问题是您使用数组指针进行指针运算:ptr + 1 将意味着“向前跳转 5 个字节,因为 ptr 指向 5 字节数组”。

改为这样做:

#include <stdio.h>

int main()
{
  char (*ptr)[5];
  char arr[5] = {'a','b','c','d','e'};
  int i;

  ptr = &arr;
  for(i=0; i<5; i++)
  {
    printf("\nvalue: %c", (*ptr)[i]);
  }
}

获取数组指针所指向的内容,然后得到一个数组。所以它们就像 C 中的任何指针一样工作。

【讨论】:

    【解决方案3】:

    您应该按如下方式创建 ptr:

    char *ptr;
    

    您已将 ptr 创建为指向字符的指针数组。上面创建了一个指向 char 的指针。

    编辑:完整的代码应该是:

    char *ptr;
    char arr[5] = {'a','b','c','d','e'};
    ptr = arr;
    printf("\nvalue:%c", *(ptr+0));
    

    【讨论】:

    • char (*ptr)[5] 是指向数组的指针,char *ptr[5] 是指针数组。
    • OP 专门询问了数组指针。所以我怀疑他们已经知道如何使用普通指针和数组了。
    【解决方案4】:

    在字符数组前使用指针

    通常,字符数组用于存储单个元素,即每个 1 个字节

    例如:

    char a[]={'a','b','c'};
    

    我们不能在其中存储多个值。

    通过在字符数组之前使用指针,我们可以将多维数组元素存储在数组中

    char *a[]={"one","two","three"};
    printf("%s\n%s\n%s",a[0],a[1],a[2]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2016-01-27
      • 2018-04-05
      相关资源
      最近更新 更多