C指针练习题求助:多级指针运算逻辑解析困惑
C指针多层嵌套练习题解析
先明确初始变量的指向关系:
char* c[]是字符串指针数组,每个元素对应一个字符串的首地址:c[0] = "he dast ga"c[1] = "lllt dumm"c[2] = "C i"c[3] = "dar nich"
char** cp[]是指向char*的指针数组,元素为c的偏移指针:cp[0] = c + 3→ 指向c[3]cp[1] = c + 2→ 指向c[2]cp[2] = c + 1→ 指向c[1]cp[3] = c→ 指向c[0]
char*** cpp = cp→cpp初始指向cp数组的首元素cp[0]
下面逐个分析main中四个printf的执行逻辑:
1. 第一个输出:**++cpp
- 前缀
++优先级高于*,先执行++cpp:cpp从指向cp[0]变为指向cp[1] - 两次解引用:
*cpp取cp[1]的值,即c + 2**cpp解引用c + 2,得到c[2]对应的字符串"C i"
- 输出:
C i
2. 第二个输出:*-- * ++cpp + 5
这里的关键是前缀--与*优先级相同,且遵循右结合规则,从右往左分步运算:
++cpp:cpp从指向cp[1]变为指向cp[2]*++cpp:取cp[2]当前值c + 1--(*++cpp):对c + 1执行前缀--,得到c(指向c[0]),同时cp[2]的值被修改为c*(--(*++cpp)):解引用c,得到c[0]对应的字符串"he dast ga"+5:字符串指针偏移5个字符(索引从0开始),从第5位的s开始输出:st ga
3. 第三个输出:cpp[-2][0] + 2
cpp[-2]等价于*(cpp - 2):当前cpp指向cp[2],cpp - 2指向cp[0],解引用后得到cp[0]的值c + 3cpp[-2][0]等价于*(c + 3):解引用得到c[3]对应的字符串"dar nich"+2:指针偏移2个字符,从第2位的r开始输出:r nich
4. 第四个输出:*(cpp[1] + 1) + 3
cpp[1]等价于*(cpp + 1):cpp + 1指向cp[3],解引用后得到cp[3]的值ccpp[1] + 1即c + 1,指向c[1]*(cpp[1] + 1)解引用得到c[1]对应的字符串"lllt dumm"+3:指针偏移3个字符,从第3位的t开始输出:t dumm
把四个输出拼接起来,最终结果是:C ist gar nich(注:实际输出无空格分隔,为连续字符串)
纠正一个误区:++cpp是指针自增操作,仅改变cpp的指向(指向cp数组的下一个元素),并不会“截断数组”。数组cp仅在第二个printf中被修改了cp[2]的值,其余元素始终保持初始状态。
内容的提问来源于stack exchange,提问作者Lapiz
相关产品推荐
相关产品推荐

