++ p的定义是什么,其中p是C中的const char * p?

时间:2015-07-19 09:45:15

标签: c pointers

如果我需要在C中迭代一个数组,我可以做类似的事情:

void uselessTest(const char *p)
{
    while(*p)
    {
        ++p;
    }
}

我想知道这意味着什么:

  • 是否在每个循环中测试if (*p != null)
  • 如果p = p + 1,那是什么意思?是p数值吗? *p应该是指向的值并且p指针的地址?那么在这个循环中p会在*p保持不变的情况下发生变化吗?

7 个答案:

答案 0 :(得分:4)

  

它是否在每个循环中测试if(* p!= null)?

我想说更正确的是它会检查*p!=0

  

如果p = p + 1,那意味着什么?是p数值吗?

appears C标准没有定义内部指针。但是在下面的例子中,我假设p保存一个表示为整数的地址(通常就是这种情况)。在这种情况下,在上面的示例中,当您向其添加一个时,p将移至下一个 地址,例如,如果p为0x1000,则增量后它将变为0x1001(这是因为char的大小为1,如果p是指向int的指针,它将向前移动四个字节 * - 给整数大小为4)。

  

所以在这个循环中p改变而* p保持不变?

不,确实*p尝试取消引用p,换句话说,获取存储在地址p的对象的内容。因此,当然如果您更改p的值,您也可能会在新地址获得不同的内容。例如,如果p的初始值为0x1000,则递增后将为0x1001,*p将尝试读取0x1001处的值,这可能与存储在0x1000处的值不同。

* 查找指针算法以获取有关该的更多详细信息

答案 1 :(得分:2)

它在每次迭代时测试* p!= null)并且如果它为null则终止循环。

它增加指针,ergo,指针指向下一个地址。因此,使用这样的循环,您可以遍历数组中的项目。

基本上这个循环的作用是:它遍历数组中的字符,直到它到达终止<input type="text" name="sum" id="sum" value="php" size="15" /> <input type="text" name="result" id="result" size="15" value="HERE THE RESULT" disabled /> 字符。在每次迭代时,指针\0增加以指向下一个字符。

答案 2 :(得分:2)

  

它是否在每个循环中测试if(* p!= null)?

C中没有null。有一个NUL终结符('\0')和NULL。后者与指针相关联。

支票是

if (*p != 0)

相同
if (*p != '\0')
  

如果p = p + 1,那意味着什么?

它将指针sizeof(*p)字节向前移动。

  

是p数值吗?

pconst char*,换句话说,是指向char的指针。

  

* p应该是指向的值而p是指针的地址吗?

*p是指针p指向的数据,而p是指针指向的地址(不同于p&#39; s地址)

答案 3 :(得分:2)

  

它是否在每个循环中测试if (*p != null)

如果你的意思是0或'\ 0',是的。

  

如果p = p + 1,那是什么意思?是p数值吗? * p应该是指向的值而p是指针的地址?所以在这个循环中p变化而* p保持不变?

它将指针前进到下一个有意义的位置,因此根据指针算法。是的,它包含一个数字,表示指向对象的地址。究竟;此外,您无法更改指向值(*p),因为它是const

答案 4 :(得分:2)

这是基本的C指针使用。

const char *p表示指向const char =&gt;的指针中的p可以修改p,但不能修改*p

根据定义,

while (*p)while (*p != 0)相同,所以循环在每次迭代时都进行测试*p == 0

++p会增加指针,因此根据我的第一句话是合法的

结论:此代码循环遍历char数组,直到指向的值为null - C字符串结尾的定义(空终止的char数组)

答案 5 :(得分:2)

  

“它是否在每个循环中测试if(* p!= null)?”

正确

p是一个包含“char类型的地址”的指针。地址是字节偏移量(偏移量为0)。

p + 1将递增以指向内存中的下一个char地址。由于char是一个字节长,p将使其字节偏移量增加1。 (如果是int32,它将增加4,例如)。 如果p最初为30,则对于char,p + 1将为31,对于int32指针将为34。

在此循环中p发生变化。由于* p是p指向的内存地址中包含的值,因此它也会发生变化(通常,它可能是随机保持不变的情况)。

答案 6 :(得分:2)

while(*p)这将读取p指向的字节/字符,并将读取值与0进行比较。即检查* p是否等于零。

++p;这与p = p + 1;相同,此增加p指向下一个字符。

实际上,由于p指向一个字符数组,因此循环可帮助您遍历所有字符,直到找到空字符。如果p是指向字符串的指针,则迭代字符串中的所有字符。 null char(\0)是字符串结束的地方。

| h | e | l | l | o | 0 |

假设字符串“hello”,并且p指向h,循环迭代5次(对于h,e,l,l,o),并在它看到0时出现。