关于C#:使用指向char数组的指针,可以访问该数组中的值吗?

Using pointer to char array, values in that array can be accessed?

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

1
char (*ptr)[5];

为其分配了char数组的地址。

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

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

1
2
printf("
value:%c"
, *(ptr+0));

它不打印值。

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


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

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

注意,使用指向数组的指针在C中并不常见。相反,只需使用指向数组中第一个元素的指针,并将长度作为一个单独的元素处理,或者将senitel值放在数组的末尾,这样就可以了解数组的结束时间,例如。

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

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


大多数响应者甚至不知道数组指针是什么…

问题在于,使用数组指针进行指针运算:ptr+1意味着"向前跳转5个字节,因为ptr指向5个字节的数组"。

改为这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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("
value: %c"
, (*ptr)[i]);
  }
}

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


在字符数组之前使用指针

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

如:

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

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

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

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

您应该创建如下的ptr:

1
char *ptr;

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

编辑:完整代码应为:

1
2
3
4
5
char *ptr;
char arr[5] = {'a','b','c','d','e'};
ptr = arr;
printf("
value:%c"
, *(ptr+0));