14
char *ptrChar;

我知道这ptrChar是指向char的指针。指向字符串的指针的命令是什么?

编辑:如果它是相同的(ptr 到 char 与 ptr 到字符串)——下面的变量定义代表什么?

char (*ptr)[N];

我很困惑。

4

3 回答 3

26

相同的符号用于指向单个字符或空终止字符串的第一个字符:

char c = 'Z';
char a[] = "Hello world";

char *ptr1 = &c;
char *ptr2 = a;      // Points to the 'H' of "Hello world"
char *ptr3 = &a[0];  // Also points to the 'H' of "Hello world"
char *ptr4 = &a[6];  // Points to the 'w' of "world"
char *ptr5 = a + 6;  // Also points to the 'w' of "world"

ptr2和中的值ptr3是相同的;和中的值也是ptr4如此ptr5。如果您要将某些数据视为字符串,请务必确保它以 null 结尾,并且您知道有多少空间可供您使用。许多问题是由于不了解可用空间以及不知道字符串是否正确以空值终止而引起的。

请注意,上面的所有指针都可以像数组一样被取消引用:

 *ptr1    == 'Z'
  ptr1[0] == 'Z'

 *ptr2    == 'H'
  ptr2[0] == 'H'
  ptr2[4] == 'o'

 *ptr4    == 'w'
  ptr4[0] == 'w'
  ptr4[4] == 'd'

  ptr5[0] ==   ptr3[6]
*(ptr5+0) == *(ptr3+6)

迟到的问题

代表什么char (*ptr)[N];

这是一个更复杂的野兽。它是一个指向字符数组的指针N。类型完全不同;它的使用方式完全不同;指向的对象的大小是完全不同的。

char (*ptr)[12] = &a;

(*ptr)[0] == 'H'
(*ptr)[6] == 'w'

*(*ptr + 6) == 'w'

请注意,它ptr + 1指向未定义的区域,但指向a. 给定一个稍微不同的场景:

char b[3][12] = { "Hello world", "Farewell", "Au revoir" };

char (*pb)[12] = &b[0];

现在:

(*(pb+0))[0] == 'H'
(*(pb+1))[0] == 'F'
(*(pb+2))[5] == 'v'

您可能不会遇到指向数组的指针,除非在相当长的一段时间内发生意外。在过去的 25 年中,我使用过几次,但数量很少,以至于我可以用一只手的手指数数(其中有几个一直在 Stack Overflow 上回答问题)。除了知道它们的存在、它们是获取数组地址的结果以及您可能不想要它之外,您实际上并不需要了解更多关于数组指针的信息。

于 2013-03-01T23:45:23.823 回答
11

一样的。AC字符串只不过是一个字符数组,所以指向字符串的指针就是指向字符数组的指针。指向数组的指针与指向其第一个元素的指针完全相同。

于 2013-03-01T23:44:25.687 回答
1

字符串基本上是从它指向的地方(char *ptrChar;)到空字符(\0)。实际上指向字符串的开头(char 数组),因此它是指向该字符串的指针,因此,例如,当您喜欢时

,您实际上在 char 开头后 x 次访问内存位置(也就是从哪里ptrChar 指向)。char *ptrChar;ptrChar[x]

于 2013-03-01T23:51:22.797 回答