char *a[] = {"BEIJING", "SHENZHEN", "SHANGHAI", "GUANGZHOU"}; char **pa[] = {a+3, a+2, a+1, a}; char ***ppa = pa; int main(void) { printf("%s, ", **++ppa); printf("%s, ", *--*++ppa+3); printf("%s, ", *ppa[-2]+3); printf("%s", ppa[-1][-1]+1); }
char *a[] = {"BEIJING", "SHENZHEN", "SHANGHAI", "GUANGZHOU"}; char **pa[] = {a+3, a+2, a+1, a}; char ***ppa = pa; int main(void) { printf("%s, ", **++ppa); printf("%s, ", *--*++ppa+3); printf("%s, ", *ppa[-2]+3); printf("%s", ppa[-1][-1]+1); }
BEIJING, SHENZHEN, SHANGHAI,GUANGZHOU
SHANGHAI, JING, NGZHOU, HENZHEN
SHANGHAI,BEIJING, GUANGZHOU, SHENZHEN
SHANGHAI,EIJING,ZHOU,ZHEN
/* 对于指针ppa 指针类型:char *** 指针指向:pa[0] 指针指向类型:char ** //指针的指向决定其偏移起始位置,指针指向的类型决定其每次移动偏移量大小 */ printf("%s, ", **++ppa); /* 运算符优先级:++ 与 * 运算符同优先级,结合性都是自右向左 ++ppa ppa自增,指向改变,向后移动一位,偏移量为char **,指向pa[1] *++ppa 取出内容,pa[1],pa[1]又指向a[2] **++ppa 取出内容,a[2],a[2]又指向字符串"SHANGHAI",printf输出 SHANGHAI */ printf("%s, ", *--*++ppa+3); /* 运算符优先级:++/-- 优先级大于 + ,且 + 的结合性是从左往右 ++ppa 上一次操作已改变ppa的指向为pa[1],再次移动,指向pa[2] *++ppa 取出内容,pa[2],pa[2]又指向a[1] --*++ppa //此时,【*++ppa】是一个char **指针,指向a[1], //则其偏移的起始位置为a[1],偏移量为char * --使其自减,指针向前移动,从a[1]向前移动一个char*的大小,指向a[0] *--*++ppa 取出内容,a[0],a[0]又指向字符串"BEIJING" *--*++ppa+3 //此时【*--*++ppa】是一个char *指针,指向一个字符串,则其偏移的起始位置 //为字符串的首字符,偏移量为char +3使指针向后移动3次,每次移动一个char,移动完成后指向字符'J' ,printf 输出,从字符'J'的位置往后输出打印到STDOUT,输出 JING */ printf("%s, ", *ppa[-2]+3); /* []作用符:【例子】 int arr[]{ 0,1,2,3 }; int *p=arr; ++p; cout << p[1] << " " << *(p + 1) << endl; cout << p[-1] << " " << *(p - 1) << endl; //p[1]等价于*(p + 1) p[-1]等价于*(p - 1) ppa[-2] 等价于*(ppa-2) ppa-2 //经过前两次操作,ppa指向pa[2],移动后指向pa[0],【但ppa //本身的指向并没有改变,还是指向pa[2]】 *(ppa-2) 取出内容,pa[0],pa[0]又指向a[3] *ppa[-2] 取出内容,a[3],a[3]又指向字符串"GUANGZHOU" *ppa[-2]+3 +3使指针移动到字符'N',printf输出 NGZHOU */ printf("%s", ppa[-1][-1]+1); /* //类似与ppa[-2]等价于*(ppa-2),ppa[-1][-1]等价于*(*(ppa-1)-1) ppa[-1] 等价于*(ppa-1) //经过前三步操作,ppa指向pa[2],移动后,指向pa[1], //取出内容pa[1],pa[1]又指向a[2] ppa[-1][-1] 等价于*(*(ppa-1)-1) *(ppa-1)-1 将上一步操作中的*(ppa-1)看做一个整体,是一个char **指针, 指向类型为char * 的a[2] 则指针 *(ppa-1) 偏移的起始位置为a[2],向前移动一次, 偏移量为char *,移动后指向a[1] *(*(ppa-1)-1) 取出内容,a[1],a[1]又指向字符串"SHENZHEN" ppa[-1][-1]+1 +1指针其移动到字符'H',printf输出 HENZHEN */
printf("%s, ", **++ppa); //++ppa后ppa指向a+3,在*ppa指向a[3]即为Shanghai printf("%s, ", *--*++ppa+3); //++ppa后ppa指向a+2,再*ppa指向a[2],然后--*++ppa指向a[1],再计算*--*++ppa为beijing,再+3偏移变为Jing printf("%s, ", *ppa[-2]+3); //ppa当前所指向a+1,ppa[-2]即为当前ppa前第二个元素,即为a+3,然后再计算*ppa[-2]+3即为NGZhou printf("%s", ppa[-1][-1]+1); //ppa当前所指向a+1,ppa[-1]即为a+2,再计算ppa[-1][-1]为a[1],即shenzhen,然后计算+1为henzheng
char* a[]是定义一个字符串数组。
a是数组名,所以它是第一个字符串的指针,同理a+1是第二个。
所以,char **pa[] 的元素是字符串的指针,char*是字符串,再来一个*便是字符串指针。
pa是数组名,同理是第一个元素的指针,即字符串指针的指针
所以***ppa=pa
++ppa,是a+2的指针,*取一次,得”SHANGHAI”的指针,再*取一次,得”SHANGHAI”字符串。
++ppa为a+1的指针,*++ppa为a+1,- -*+ppa为a,*- -*+ppa为”BEIJING”字符串(也是首字符’B’的地址),*- -*+ppa+3即字符’J’的地址,打印得”JING”。
后面不写了。
printf("%s, ", **++ppa); //++ppa后ppa指向a+2,在*ppa指向a[2]即为SHANGHAI printf("%s, ", *--*++ppa+3); //++ppa后ppa指向a+1,再*ppa指向a[1],然后--*++ppa指向a[0],再计算*--*++ppa为BEIJING,再+3偏移变为JING printf("%s, ", *ppa[-2]+3); //ppa当前所指向a+1,ppa[-2]即为当前ppa前第二个元素,即为a+3,然后再计算*ppa[-2]为GUANGZHOU,*ppa[-2]+3即为NGZHOU printf("%s", ppa[-1][-1]+1); //ppa当前所指向a+1,ppa[-1]即为a+2,再计算ppa[-1][-1],为*(a+2-1)即a[1],即SHENZHEN,然后计算+1为HENZHENG