#include <stdio.h>
void main()
{
char *a[3]={"C","C++","Java"};
char *p,**pp;
puts(a[1]);/*输出C++,puts函数输出整个字符串包括'\0'*/ /*C++*/
printf("%c\n",*(a[2]+2));/*输出v,a[2]为字符串java,a[2]+2表示首字符向后移动2位,即字母v,"*"表示取内容*/ /*v*/
puts(*(pp+1)+1); /*puts输出从当前字符+一直到'\0'结束,所以输出++*/ /*++*/
p=a[1]; /*a[1]表示C++的首地址,赋值给p*/
puts(p+1); /*输出C++首地址向后一个的地址即+的地址,然后从当前地址输出到'\0'结束即为 ++*/ /*++*/
pp=&p; /*此时pp为p的地址,即此时pp指向p即a[1],a[1]也是指针,所以此时即为指针的指针*/
puts(*pp); /*pp即为p的地址,即指向p,p为a[1]这个地址指向C++所以输出C++*/ /*C++*/
puts(*(pp-1)); /*pp代表C++的首地址即C的地址,然而pp-1是C的地址前面的一个地址,然而我们并不知道是什么,不是"C"的地址,其实"C"与"C++"之间隔了很多未知的地址, 所以此时的指针为野指针,会输出一些很奇怪的字符或者乱码*/
}
void main()
{
char *a[3]={"C","C++","Java"};
char *p,**pp;
puts(a[1]);/*输出C++,puts函数输出整个字符串包括'\0'*/ /*C++*/
printf("%c\n",*(a[2]+2));/*输出v,a[2]为字符串java,a[2]+2表示首字符向后移动2位,即字母v,"*"表示取内容*/ /*v*/
pp=a;/*数组名a当没有遇到sizeof,&,定义时,表示数组首地址a[0],pp为指针*/
puts(*(pp+1)); /* 此时pp为首地址a[0],pp+1向下移动一个地址为a[1],"*"取地址里的内容即为C++,所以输出C++*/ /*C++*/
printf("%c\n",*(*(pp+1)+1)); /*由上知道*(pp+1)为C++,*(pp+1)+1,表示C++由C向后移动一个字符此时为+,所以输出+*/ /*+*/puts(*(pp+1)+1); /*puts输出从当前字符+一直到'\0'结束,所以输出++*/ /*++*/
p=a[1]; /*a[1]表示C++的首地址,赋值给p*/
puts(p+1); /*输出C++首地址向后一个的地址即+的地址,然后从当前地址输出到'\0'结束即为 ++*/ /*++*/
pp=&p; /*此时pp为p的地址,即此时pp指向p即a[1],a[1]也是指针,所以此时即为指针的指针*/
puts(*pp); /*pp即为p的地址,即指向p,p为a[1]这个地址指向C++所以输出C++*/ /*C++*/
puts(*(pp-1)); /*pp代表C++的首地址即C的地址,然而pp-1是C的地址前面的一个地址,然而我们并不知道是什么,不是"C"的地址,其实"C"与"C++"之间隔了很多未知的地址, 所以此时的指针为野指针,会输出一些很奇怪的字符或者乱码*/
}
/*代码运行时要把后面的注释删了,防止可能出现一些不必要的错误*/