C++ 指针和数组内存

C++ 指针和数组内存,c++,arrays,string,pointers,C++,Arrays,String,Pointers,我对以下代码的输出感到困惑: char *s[]={"knowledge","is","power"}; char t[]={"Hello"}; char **p,*q; p=s; q=t; cout<<++*p; cout<<*p++; cout<<++*p; cout<<++*q; 现在,输出为Knowledge Nowlede s I 请解释内存分配是如何在两个阵列中进行的 char *s[] = {"knowledge", "is", "

我对以下代码的输出感到困惑:

char *s[]={"knowledge","is","power"};
char t[]={"Hello"};
char **p,*q;
p=s;
q=t;
cout<<++*p;
cout<<*p++;
cout<<++*p;
cout<<++*q;
现在,输出为Knowledge Nowlede s I

请解释内存分配是如何在两个阵列中进行的

char *s[] = {"knowledge", "is", "power"};

       ===========================================================
addr1: | 'k' | 'n' | 'o' | 'w' | 'l' | 'e' | 'd' | 'g' | 'e' | 0 |
       ===========================================================

       =================
addr2: | 'i' | 's' | 0 |
       =================

       ===================================
addr3: | 'p' | 'o' | 'w' | 'e' | 'r' | 0 |
       ===================================

       =========================
addr4: | addr1 | addr2 | addr3 |
       =========================

    s: addr4


看这张照片。然后,简化语句以理解它们。通过使用无效的指针值访问数组,也会有未定义的行为。指针算术是需要小心处理的。请尝试指针算术下的此链接。这应该会澄清你的疑问,非常类似的问题:为什么不打印e@Max Vollmer,但它取H+1=73+1=74.chart[]={Hello};与char*t[]={Hello};非常不同;。您没有指向字符数组指针数组的指针,而是指向字符数组的指针。因此,当您取消引用该指针时,您不会得到指向char数组的指针,而是得到char。因此,您增加的是字符,而不是指针。
char *t[] = {"Hello"};

       ===================================
addr5: | 'H' | 'e' | 'l' | 'l' | 'o' | 0 |
       ===================================

       =========
addr6: | addr5 |
       =========

    t: addr6
char **p,**q;
p=s;
q=t;

    p: addr4
    q: addr6
++*p;

     p: addr4
    *p: addr1
  ++*p: addr1 + 1
(!) *p: addr1 + 1
*p++;

     p: addr4
    *p: addr1 + 1
  *p++: addr1 + 1
(!)  p: addr4 + 1
++*p;

     p: addr4 + 1
    *p: addr2
  ++*p: addr2 + 1
(!) *p: addr2 + 1
++*q;

     q: addr6
    *q: addr5
  ++*q: addr5 + 1
(!) *q: addr5 + 1