一道题目玩转指针数组和二级指针
请大家先看下面的代码?
运行结果= str1 = Programming
str2 = is
c1 = f
c2 = 2
c3 = E
为了方便说明问题=我们将上面的字符串数组改成下面的形式=它们都是等价的=
char *lines[5]定义了一个指针数组=它的每个元素的类型都是char *。在表达式中使用 lines 时=它会转换为一个类型为char **的指针=这样*lines就表示一个指向字符的指针=而**lines表示一个具体的字符=这一点很重要=读者一定要明白。
指针是可以进行运算的=lines 表示数组的首地址=第0个元素的地址==lines+0、lines+1、lines+2 ... 分别表示第0、1、2 ...个元素的地址+*(lines+0)或lines[0]、*(lines+1)或lines[1]、*(lines+2)或lines[2] ... 分别是字符串 string0, string1, string2 ... 的首地址。所以+
*lines == *(lines+0) == lines[0] == string0
*(lines+1) == lines[1] == string1
*(lines+2) == lines[2] == string2
...
注意=lines 是二级指针=*(lines+i) 是一级指针+**(lines+i) 才是具体的字符。
上面的题目中+
lines[1]+它是一个指针+指向字符串string1+即 string1 的首地址。
*(lines + 3)+lines + 3 为数组中第 3 个元素的地址+*(lines + 3) 为第 3 个元素的值+它是一个指针+指向字符串 string3。
*(*(lines + 4) + 6)+*(lines + 4) + 6 == lines[4] + 6 == string4 + 6+表示字符串 string4 中第 6 个字符的地址+即 f 的地址+所以 *(*(lines + 4) + 6) 就表示字符 f。
(*lines + 5)[5]+*lines + 5 为字符串 string0 中第 5 个字符的地址+即 2 的地址+(*lines + 5)[5]等价于*(*lines + 5 + 5)+表示第10个字符+即 2。
*lines[0] + 2+lines[0] 为字符串 string0 中第 0 个字符的地址+即 C 的地址+*lines[0] 也就表示第 0 个字符+即字符 C。字符与整数运算+首先转换为该字符对应的 ASCII 码+然后再运算+所以 *lines[0] + 2 = 67 + 2 = 69=69 对应的字符为 E。
文档下载
转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。
链接:一道题目玩转指针数组和二级指针http://www.gufeng7.com/niaolang/373.html
联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com