关于指针解除引用的困惑

时间:2018-02-05 17:47:01

标签: c++

如果我有下面的代码片段,我对指针的解引用感到困惑:

char str[]="ABC";
char *a=str;

那么+ 1是指什么?

是B还是BC作为一个整体?

这种困惑在我心中恍然大悟,因为当我给出时:

cout<<a+1;

它给了我BC而不是B,为什么会这样?

如果我有一个交换值的函数,并且它接受如下参数:

void swap((a+1),(a+2))

上述功能如何解决? 它会与B交换B吗?

4 个答案:

答案 0 :(得分:3)

这是你的指针a,指向字符串“ABC”的开头(注意末尾的\ 0表示隐式NUL终结符字节):

ABC\0
^
|
a

以下是将a添加一个后的样子:

ABC\0
 ^
 |
 a

请注意,a现在指向char数组中的下一个条目。 cout将打印字符,直到它到达数组末尾的NUL终结符字节,因此如果你执行cout<<(a+1),它将打印“BC”。

答案 1 :(得分:2)

指向元素和指向元素范围的开头之间的区别完全取决于您如何使用该指针。它不是指针的固有属性。 a+1引用'B'"BC"是否取决于您对指针执行的操作。恰好std::cout将所有char指针视为指向C字符串的指针。

答案 2 :(得分:1)

  

那么+ 1是指什么?

a指向数组str的第一个元素。第一个字符的值为'A'a + 1表达式的结果是str指向a之后'B的下一个元素的指针。下一个元素是值为cout<<a+1; &#39;。

的字符
  

这种困惑在我心中恍然大悟,因为当我给出时:

std::cout
     

它给了我BC而不是B,为什么会这样?

这是因为当您将字符的指针插入字符流(例如\0)时,会假定它指向数组中的字符(就像在这种情况下一样),并且行为是流式传输该数组中的所有字符,直到达到空终止字符(A)。

所以,就像当你插入指向A的指针以及从ABC开始直到空终止字符打印(B)的所有字符时一样,当你通过指向B的指针,然后打印从BC开始的所有字符(std::cout << *a; // A std::cout << *(a + 1); // B )。

如果您的意图是:

,您可以取消引用指针以仅插入一个字符
std::cout << a[0]; // A
std::cout << a[1]; // B

([+]*)([ ])*(\w)?([\d]+)

答案 3 :(得分:0)

char str[]="ABC";
char *a=str;

a是char指针,它指向str,如下所示

    --------------------
   |  A  |  B  C  | \0  |
    ----------------------
  0x100   0x101 ... .. (lets say 0x100  is the base address of str)
  str
  a

如果您打印

cout<<a<<endl;/* it starts from 0x100 location and prints upto NULL */

/* a+1 == 0x100 + 1x1  == 0x101 */
cout<<a+1<<endl; /* a+1 means it starts printing from 0x101 location upto NULL character so it prints BC*/

编辑:

void swap((a+1),(a+2))

以上功能将如何运作?它会与B交换B吗? =&gt; 是的,它将交换B和C,取决于交换函数逻辑。