指向C中字符串的指针?

指向C中字符串的指针?,c,string,pointers,C,String,Pointers,我知道ptrChar是指向char的指针。指向字符串的指针的命令是什么 编辑:如果相同(ptr到char和ptr到string)-下面的变量定义代表什么 char *ptrChar; 我很困惑。同样如此。C字符串只不过是一个字符数组,所以指向字符串的指针就是指向字符数组的指针。指向数组的指针与指向其第一个元素的指针完全相同。相同的符号用于指向单个字符或以null结尾的字符串的第一个字符: char (*ptr)[N]; ptr2和ptr3中的值相同;ptr4和ptr5中的值也是如此。如果要将

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

编辑:如果相同(ptr到char和ptr到string)-下面的变量定义代表什么

char *ptrChar;

我很困惑。

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

相同的符号用于指向单个字符或以null结尾的字符串的第一个字符:

char (*ptr)[N];
ptr2
ptr3
中的值相同;
ptr4
ptr5
中的值也是如此。如果要将某些数据视为字符串,则必须确保它以null结尾,并且知道有多少空间可供使用。许多问题是由于不了解可用空间以及不知道字符串是否正确地以null结尾而导致的

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

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"

迟加问题 什么是字符(*ptr)[N]表示

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

 *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)
请注意,
ptr+1
指向未定义的区域,但指向
a
开头之外的“一个12字节数组”。给出一个稍微不同的场景:

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

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

*(*ptr + 6) == 'w'
现在:


在相当长的一段时间内,您可能不会遇到指向数组的指针,除非是出于偶然;在过去的25年中,我已经使用过几次了,但是使用次数太少了,我只能用一只手数一数(其中有几个已经回答了有关堆栈溢出的问题)。除了知道它们的存在,它们是获取数组地址的结果,并且您可能不想要它之外,您真的不需要更多地了解指向数组的指针。

字符串基本上是从它指向的位置(
char*ptrChar;
)到空字符(
\0
).

字符*ptrChar实际上指向字符串的开头(char数组),因此这是指向该字符串的指针,
因此,例如,当您喜欢
ptrChar[x]
时,您实际上会在字符的开头(即ptrChar指向的位置)之后访问内存位置x次。它们只在您遵循它时才存在:)这是发生缓冲区溢出的常见地方。C不会对数组进行边界检查,因此如果程序员忘记检查用户字符串输入,他们可以写入超过数组末尾的数据,并将任意(可能是恶意的)数据放入数组之外的内存中。答案是10倍。我很困惑。那么上面的命令是什么意思:char(*ptr)[N];?“指向数组的指针与指向其第一个元素的指针完全相同。”不,地址相同,但类型不同。相关,您是。嗨@Jonathan Leffler,感谢您的详细解释!所以在形式上这应该被称为“字符串指针”?人们通常称
char*
变量为字符串指针;这意味着指针指向以null结尾的字符数组。不过,并非所有的
char*
变量都是指向字符串的指针。在我的示例中,
ptr1
不是指向字符串的指针;它指向单个字符,并且它不是以null结尾的字符数组(字符串就是这样)的一部分。当然,
char(*pb)[12]
中的指针绝对不是指向字符串的指针;它是一个指向12个字符数组的指针(数组可能包含也可能不包含以null结尾的字符串)。哦,现在我明白了,谢谢!所有这些都是关于C.ISO/IEC 9899:1999§7.1.1术语定义中以空结尾的字符串。1字符串是以第一个空字符结尾并包括第一个空字符的连续字符序列。这是本节描述C库的第一句话。C2011标准也这么说。int*a={1,2,3}是否有效?
(*(pb+0))[0] == 'H'
(*(pb+1))[0] == 'F'
(*(pb+2))[5] == 'v'