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