指针程序练习 1.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
///////////////////////////////////////////////////////////////
printf("----------------------%s\n",*p);
printf(“Q1:下述等式成立吗? p[0]= *(p+0) = *p\n\n”); //测试 p[0],*(p+0),*p 三者是否相同
if( p[0] == *(p+0)) && (*p=p[0]) )
printf(“\t成立 !\n"); //成立
printf(" 输出 *p 为 %s\n",*p); //输出 abcdef
printf(" 输出 *(p+0)为 %s\n",*(p+0)); //输出 abcdef
printf(" 输出 p[0] 为 %s\n",p[0]); //输出 abcdef
printf(" 输出 s 为 %s\n",s); //输出 abcdef
}
指针程序练习 2.c
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r = q ; // r 为 3 级指针变量,是指向指针数组 q 的指针,
printf("Q2,下述等式成立吗? q[2]= *(q+2)=&(p[3])= p+3\n\n"); //测试 q[2],*(q+2),&p[3],p+3四者是否相同
if (q[2] == *(q+2) &&
q[2] == &(p[3]) &&
q[2] == p+3 )
printf("\n\t成立 !\n"); // 成立
printf(" 输出 q[2] 为 %X\n",q[2]); //输出 p[3]的地址
printf(" 输出 *(q+2) 为 %X\n",*(q+2)); //输出 p[3]的地址
printf(" 输出 &p[3] 为 %X\n",&p[3]); //输出 p[3]的地址
printf(" 输出 p+3 为 %X\n",p+3); //输出 p[3]的地址
}
指针程序练习 3.c
void main( ) //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r = q ; // r 为 3 级指针变量,是指向指针数组 q 的指针,
printf(“Q3,下述等式成立吗? r[0][0] = s \n”); // 测试 r[0][0] 与 s 是否相同
printf("\nr[0][0] = q[0][0] = p[0][0] = p[0] = s = \"abcdef\" \n");
if (r[0][0] == s)
printf("\n\t成立 !\n\n"); // 成立
}
指针程序练习 4.c
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[] = {p,p+2,p+3,p+1}; // q 为指针数组变量,q数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r = q ; // r 为 3 级指针变量,是指向指针数组 q 的指针,
printf("Q4,下述等式成立吗? r[0][0]=*(r[0]+0)=*(r[0])=*(*(r+0))=*(*r)=**r\n");
///测试 r[0][0],*(r[0]+0),*(r[0]),*(*(r+0)),*(*r),**r六者是否相同
if (r[0][0] == *(r[0]+0) &&
r[0][0] == *(r[0]) &&
r[0][0] == *(*(r+0)) &&
r[0][0] == *(*r) &&
r[0][0] == **r)
printf(“\t成立 !\n"); //成立
printf(,输出 r[0][0] 为 %s\n”,r[0][0]); //输出 **r的值,字符串
printf(,输出 *(r[0]+0) 为 %s\n”,*(r[0]+0)); //输出 p[3]的内容,字符串
printf(" 输出 *(r[0]) 为 %s \n",*(r[0])); //输出 **r的值,字符串
printf(" 输出 *(*(r+0)) 为 %s \n",*(*(r+0))); //输出 **r的值,字符串
printf(,输出 *(*r) 为 %s\n”,*(*r)); //输出 *(*r)的值,字符串
printf(,输出 **r 为 %s\n”,**r); //输出 **r的值,字符串
}
指针程序练习 5.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,
// 而 q 又是指向指针数组 p 的指针
printf("Q5,请观察下列结果 \n"); ///观察 &r,r,*r,r[0],**r(%x),*r[0],**r(%s),*r[0] 的结果
printf("r 变量本身的地址 &r add1,%X\n",&r); // 输出 r 变量本身的地址
printf("r 变量指向的地址 r add1,%X\n",r); // 输出 r 变量指向的地址
printf("*r 指向的地址 *r add1,%X\n",*r); // 输出 *r 指向的地址
printf("r[0] 指向的地址 r add1,%X\n",r[0]); // 输出 r[0] 指向的地址
printf("**r 指向的地址 r add1,%X\n",**r); // 输出 **r 指向的地址
printf("*r[0] 指向的地址 r add1,%X\n",*r[0]); // 输出 *r[0] 指向的地址
printf("**r 指向的内容 r add1,%s\n",**r); // 输出 **r 指向的内容
printf("*r[0] 指向的内容 r add1,%s\n",*r[0]); // 输出 *r[0] 指向的内容
}
指针程序练习 6.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
printf("Q6,请观察下列结果 \n"); // 观察 &r,r,*r,r[1],**r(%x),*r[1],**r(%s),*r[1] 的结果
printf("r 变量本身的地址 &r add1,%X\n",&r); // 输出 r 变量本身的地址
printf("r 变量指向的地址 r add1,%X\n",r); // 输出 r 变量指向的地址
printf("*r 指向的地址 *r add1,%X\n",*r); // 输出 *r 指向的地址
printf("r[1] 指向的地址 r add1,%X\n",r[1]); // 输出 r[1] 指向的地址
printf("**r 指向的地址 r add1,%X\n",**r); // 输出 **r 指向的地址
printf("*r[1] 指向的地址 r add1,%X\n",*r[1]); // 输出 *r[1] 指向的地址
printf("**r 指向的内容 r add1,%s\n",**r); // 输出 **r 指向的内容
printf("*r[1] 指向的内容 r add1,%s\n",*r[1]); // 输出 *r[1] 指向的内容
}
指针程序练习 7.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; //q为指针数组变量,q数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
// 注意,*r[0]等价于 *(r[0]),等价于 *(*r)
// 再注意,*r[1]等价于 *(r[1]),等价于 *(*(r+1)),等价于 **(r+1)
// 注意,r指向的地址是 q[0]本身的地址,r+1应该是 q[1]的地址
// 注意,*(r+1)等价于 q[1],**(r+1)等价于 *q[1],而 *q[1]等价于 p[2]
// 注意:因此 *r[1]等价于 **(r+1),等价于 *q[1],等价于 p[2]
printf("Q7,请观察下列结果 \n");
printf("*r[1]的地址, %X\n",*r[1]); // 输出 *r[1]所代表的地址值
printf("r[0]+2,%X\n",r[0]+2); // 输出 r[0]+2所代表的地址值
printf("r[2],%X\n",r[2]); // 输出 r[2]所代表的地址值
printf("r 变量本身的地址, %X\n",&r); // 输出 r 变量本身的地址
printf("r 变量指向的地址, %X\n",r); // 输出 r 变量指向的地址
printf("*r 指向的地址, %X\n",*r); // 输出 *r 指向的地址
printf("r[2] 指向的地址, %X\n",r[2]); // 输出 r[2] 指向的地址
printf("**r 指向的地址, %X\n",**r); // 输出 **r 指向的地址
printf("*r[2] 指向的地址, %X\n",*r[2]); // 输出 *r[2] 指向的地址
printf("**r 指向的内容, %s\n",**r); // 输出 **r 指向的内容
printf("*r[2] 指向的内容, %s\n",*r[2]); // 输出 *r[2] 指向的内容
}
指针程序练习 8.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s[]为字符数组
char* t = "abcdef"; //t为指向字符串的指针变量
char* p[]={“abcdef”,“ghijk”,“lmnop”,“qrstuv”}; //p为指针数组变量,p数组元素依次指向字符串
"abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,r 是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
printf("Q8,请观察输出结果 \n\n"); //观察输出结果
printf("输出 r[3][2]所指向的字符串 %s\n",r[3][2]); //输出 r[3][2]所指向的字符串
printf("输出 r+3 所指向的地址, %X\n",(r+3)); // 输出 r+3 所指向的地址
printf("输出 r+3 地址中的值所指向的地址, %X\n",*(r+3)); // 输出 r+3 地址中的值所指向的地址
printf("输出 r+3 地址中所指向的地址加上偏移量 2后的地址, %X\n",*(r+3)+2);
printf("输出 *(*(r+3)+2)所指向的地址, %X\n\n",*(*(r+3)+2));
//输出 r+3 地址中的值所指向的地址加上偏移量 2后的地址中的地址
printf("输出 r[3][2]所指向的地址 r[3][2],%X\n",r[3][2]); //输出 r[3][2]所指向的地址
printf("输出 *(r[3]+2)所指向的地址 *(r[3]+2),%X\n",*(r[3]+2)); //输出 *(r[3]+2)所指向的地址
printf("输出 *(*(r+3)+2)所指向的地址 *(*(r+3)+2),%X\n",*(*(r+3)+2)); // 输出 *(r[3]+2)所指向的地址
printf("输出 *(*(r+3)+2)所指向的字符串 *(*(r+3)+2),%s\n",*(*(r+3)+2)); // 输出 *(r[3]+2)所指向的字符串
}
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
///////////////////////////////////////////////////////////////
printf("----------------------%s\n",*p);
printf(“Q1:下述等式成立吗? p[0]= *(p+0) = *p\n\n”); //测试 p[0],*(p+0),*p 三者是否相同
if( p[0] == *(p+0)) && (*p=p[0]) )
printf(“\t成立 !\n"); //成立
printf(" 输出 *p 为 %s\n",*p); //输出 abcdef
printf(" 输出 *(p+0)为 %s\n",*(p+0)); //输出 abcdef
printf(" 输出 p[0] 为 %s\n",p[0]); //输出 abcdef
printf(" 输出 s 为 %s\n",s); //输出 abcdef
}
指针程序练习 2.c
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r = q ; // r 为 3 级指针变量,是指向指针数组 q 的指针,
printf("Q2,下述等式成立吗? q[2]= *(q+2)=&(p[3])= p+3\n\n"); //测试 q[2],*(q+2),&p[3],p+3四者是否相同
if (q[2] == *(q+2) &&
q[2] == &(p[3]) &&
q[2] == p+3 )
printf("\n\t成立 !\n"); // 成立
printf(" 输出 q[2] 为 %X\n",q[2]); //输出 p[3]的地址
printf(" 输出 *(q+2) 为 %X\n",*(q+2)); //输出 p[3]的地址
printf(" 输出 &p[3] 为 %X\n",&p[3]); //输出 p[3]的地址
printf(" 输出 p+3 为 %X\n",p+3); //输出 p[3]的地址
}
指针程序练习 3.c
void main( ) //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r = q ; // r 为 3 级指针变量,是指向指针数组 q 的指针,
printf(“Q3,下述等式成立吗? r[0][0] = s \n”); // 测试 r[0][0] 与 s 是否相同
printf("\nr[0][0] = q[0][0] = p[0][0] = p[0] = s = \"abcdef\" \n");
if (r[0][0] == s)
printf("\n\t成立 !\n\n"); // 成立
}
指针程序练习 4.c
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[] = {p,p+2,p+3,p+1}; // q 为指针数组变量,q数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r = q ; // r 为 3 级指针变量,是指向指针数组 q 的指针,
printf("Q4,下述等式成立吗? r[0][0]=*(r[0]+0)=*(r[0])=*(*(r+0))=*(*r)=**r\n");
///测试 r[0][0],*(r[0]+0),*(r[0]),*(*(r+0)),*(*r),**r六者是否相同
if (r[0][0] == *(r[0]+0) &&
r[0][0] == *(r[0]) &&
r[0][0] == *(*(r+0)) &&
r[0][0] == *(*r) &&
r[0][0] == **r)
printf(“\t成立 !\n"); //成立
printf(,输出 r[0][0] 为 %s\n”,r[0][0]); //输出 **r的值,字符串
printf(,输出 *(r[0]+0) 为 %s\n”,*(r[0]+0)); //输出 p[3]的内容,字符串
printf(" 输出 *(r[0]) 为 %s \n",*(r[0])); //输出 **r的值,字符串
printf(" 输出 *(*(r+0)) 为 %s \n",*(*(r+0))); //输出 **r的值,字符串
printf(,输出 *(*r) 为 %s\n”,*(*r)); //输出 *(*r)的值,字符串
printf(,输出 **r 为 %s\n”,**r); //输出 **r的值,字符串
}
指针程序练习 5.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,
// 而 q 又是指向指针数组 p 的指针
printf("Q5,请观察下列结果 \n"); ///观察 &r,r,*r,r[0],**r(%x),*r[0],**r(%s),*r[0] 的结果
printf("r 变量本身的地址 &r add1,%X\n",&r); // 输出 r 变量本身的地址
printf("r 变量指向的地址 r add1,%X\n",r); // 输出 r 变量指向的地址
printf("*r 指向的地址 *r add1,%X\n",*r); // 输出 *r 指向的地址
printf("r[0] 指向的地址 r add1,%X\n",r[0]); // 输出 r[0] 指向的地址
printf("**r 指向的地址 r add1,%X\n",**r); // 输出 **r 指向的地址
printf("*r[0] 指向的地址 r add1,%X\n",*r[0]); // 输出 *r[0] 指向的地址
printf("**r 指向的内容 r add1,%s\n",**r); // 输出 **r 指向的内容
printf("*r[0] 指向的内容 r add1,%s\n",*r[0]); // 输出 *r[0] 指向的内容
}
指针程序练习 6.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
printf("Q6,请观察下列结果 \n"); // 观察 &r,r,*r,r[1],**r(%x),*r[1],**r(%s),*r[1] 的结果
printf("r 变量本身的地址 &r add1,%X\n",&r); // 输出 r 变量本身的地址
printf("r 变量指向的地址 r add1,%X\n",r); // 输出 r 变量指向的地址
printf("*r 指向的地址 *r add1,%X\n",*r); // 输出 *r 指向的地址
printf("r[1] 指向的地址 r add1,%X\n",r[1]); // 输出 r[1] 指向的地址
printf("**r 指向的地址 r add1,%X\n",**r); // 输出 **r 指向的地址
printf("*r[1] 指向的地址 r add1,%X\n",*r[1]); // 输出 *r[1] 指向的地址
printf("**r 指向的内容 r add1,%s\n",**r); // 输出 **r 指向的内容
printf("*r[1] 指向的内容 r add1,%s\n",*r[1]); // 输出 *r[1] 指向的内容
}
指针程序练习 7.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s{]为字符数组
char* t = "abcdef"; //t为指向字符数组的指针变量
char* p[]={"abcdef","ghijk","lmnop","qrstuv"}; //p为指针数组变量,p数组元素依次指向
//字符串 "abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; //q为指针数组变量,q数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
// 注意,*r[0]等价于 *(r[0]),等价于 *(*r)
// 再注意,*r[1]等价于 *(r[1]),等价于 *(*(r+1)),等价于 **(r+1)
// 注意,r指向的地址是 q[0]本身的地址,r+1应该是 q[1]的地址
// 注意,*(r+1)等价于 q[1],**(r+1)等价于 *q[1],而 *q[1]等价于 p[2]
// 注意:因此 *r[1]等价于 **(r+1),等价于 *q[1],等价于 p[2]
printf("Q7,请观察下列结果 \n");
printf("*r[1]的地址, %X\n",*r[1]); // 输出 *r[1]所代表的地址值
printf("r[0]+2,%X\n",r[0]+2); // 输出 r[0]+2所代表的地址值
printf("r[2],%X\n",r[2]); // 输出 r[2]所代表的地址值
printf("r 变量本身的地址, %X\n",&r); // 输出 r 变量本身的地址
printf("r 变量指向的地址, %X\n",r); // 输出 r 变量指向的地址
printf("*r 指向的地址, %X\n",*r); // 输出 *r 指向的地址
printf("r[2] 指向的地址, %X\n",r[2]); // 输出 r[2] 指向的地址
printf("**r 指向的地址, %X\n",**r); // 输出 **r 指向的地址
printf("*r[2] 指向的地址, %X\n",*r[2]); // 输出 *r[2] 指向的地址
printf("**r 指向的内容, %s\n",**r); // 输出 **r 指向的内容
printf("*r[2] 指向的内容, %s\n",*r[2]); // 输出 *r[2] 指向的内容
}
指针程序练习 8.c
#include <stdio.h> //预编译命令
void main() //主函数
{ //函数体开始
int i;
char s[] = "abcdef"; //s[]为字符数组
char* t = "abcdef"; //t为指向字符串的指针变量
char* p[]={“abcdef”,“ghijk”,“lmnop”,“qrstuv”}; //p为指针数组变量,p数组元素依次指向字符串
"abcdef","qhijk","lmnop","qrstuv"
char** q[]={p,p+2,p+3,p+1}; // q 为指针数组变量,q 数组元素依次指向指针数组元素 p[0],p[2],p[3],p[1]
char** *r=q; // r 为 3 级指针变量,r 是指向指针数组 q 的指针,而 q 又是指向指针数组 p 的指针
printf("Q8,请观察输出结果 \n\n"); //观察输出结果
printf("输出 r[3][2]所指向的字符串 %s\n",r[3][2]); //输出 r[3][2]所指向的字符串
printf("输出 r+3 所指向的地址, %X\n",(r+3)); // 输出 r+3 所指向的地址
printf("输出 r+3 地址中的值所指向的地址, %X\n",*(r+3)); // 输出 r+3 地址中的值所指向的地址
printf("输出 r+3 地址中所指向的地址加上偏移量 2后的地址, %X\n",*(r+3)+2);
printf("输出 *(*(r+3)+2)所指向的地址, %X\n\n",*(*(r+3)+2));
//输出 r+3 地址中的值所指向的地址加上偏移量 2后的地址中的地址
printf("输出 r[3][2]所指向的地址 r[3][2],%X\n",r[3][2]); //输出 r[3][2]所指向的地址
printf("输出 *(r[3]+2)所指向的地址 *(r[3]+2),%X\n",*(r[3]+2)); //输出 *(r[3]+2)所指向的地址
printf("输出 *(*(r+3)+2)所指向的地址 *(*(r+3)+2),%X\n",*(*(r+3)+2)); // 输出 *(r[3]+2)所指向的地址
printf("输出 *(*(r+3)+2)所指向的字符串 *(*(r+3)+2),%s\n",*(*(r+3)+2)); // 输出 *(r[3]+2)所指向的字符串
}