使用指向char数组的指针,可以访问该数组中的值?

Pra*_*avi 20 c pointers

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

char (*ptr)[5];
Run Code Online (Sandbox Code Playgroud)

为它指定了一个char数组的地址.

char arr[5] = {'a','b','c','d','e'};
ptr = &arr;
Run Code Online (Sandbox Code Playgroud)

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

printf("\nvalue:%c", *(ptr+0));
Run Code Online (Sandbox Code Playgroud)

它不打印该值.

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

nos*_*nos 20

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

printf("\nvalue:%c", (*ptr)[0]); ,这是一样的 *((*ptr)+0)

请注意,使用指向数组的指针在C中并不常见,只需使用指向数组中第一个元素的指针,并将长度作为单独的元素处理,或者将senitel值放在结尾处.数组,所以人们可以在数组结束时学习,例如

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

printf("\nvalue:%c", ptr[0]);
Run Code Online (Sandbox Code Playgroud)

  • 数组指针具有(有限的)用途,例如,它们在动态声明多维数组时非常有用,并且您希望相邻地声明内存.所以我不会完全解雇他们.但正如我们从这个帖子中可以看到的那样,大多数C程序员对它们一无所知,所以单凭这一点就是远离它的理由. (2认同)

Lun*_*din 6

大多数人回答甚至不知道数组指针是什么...

问题是你用数组指针做指针算术:ptr + 1意味着"因为ptr指向一个5字节的数组,所以前面跳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]);
  }
}
Run Code Online (Sandbox Code Playgroud)

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