C语言,数组里的指针问题,一道选择题而已,求大神告知
第24题,p1=p-1,意思不就是数组a首元素地址前面的地址吗,那怎么可能判断p1>a成功呢,这里a不就代表数组a的首元素地址吗。。。还有第一个for语句里面判断*p的意...
第24题,p1=p-1,意思不就是数组a首元素地址前面的地址吗,那怎么可能判断p1>a成功呢,这里a不就代表数组a的首元素地址吗。。。还有第一个for语句里面判断*p的意思是判断a为真还是神马,定义的字符指针要判断啥啊。。。快哭了
展开
3个回答
展开全部
a是一个数组,那么变量a本身,就是一个不可改变地址的指针。你说的没错,a就是首元素地址。
那么注意,第一个for循环虽然是空语句,但将p进行了++操作,完成后,是将p指向了a数组的末端后一位(结束标记位'\0')。
第二个for,p1从数组末端开始,每次减一,一直到p1>=a,也就是数组的首端,而p每次加1,实际是扩展了数组的长度,将第4/5/6位分别赋值为3/2/1位,结果是D。
那么注意,第一个for循环虽然是空语句,但将p进行了++操作,完成后,是将p指向了a数组的末端后一位(结束标记位'\0')。
第二个for,p1从数组末端开始,每次减一,一直到p1>=a,也就是数组的首端,而p每次加1,实际是扩展了数组的长度,将第4/5/6位分别赋值为3/2/1位,结果是D。
追问
那第一个for的空循环,判断*p----就是它指向地址恒为真导致的咩
追答
for的第二个子语句,是条件判断。;*p; 就是判断*p是否为真,等价于:*p != 0 作为字符串指针,等价于: *p != '\0' ,也就是p没有指向字符串的末尾的意思。加上最后一次的p++,就是让p指向了末尾的 '\0'
展开全部
首先你得了解字符串是以'\0'结束的,也就是a实际存储的是{'x', 'y','z','\0'}.然后你得了解指针加减,一个指针加1,就是指向下一个位置, 在这里实际就是指向下一个字符(如果是int数组,就是下一个整数).
理解了这两点然后再来看你这道题:
首先*p = a,让p指向数组第一个字符'x',for(;*p;p++);让p不断往后移知道遇到’\0'('\0'的实际值是0),也就是循环结束后p指向了‘\0'。for(p1=p-1;p1>=a;p++,p1--)*p=*p1, 把p1初始化指向'z',然后*p=*p1是用'z'覆盖掉'\0',然后p1--就是p1朝后退一步指向’y', p++就是把p向后移一步指向'z'后面。。。接着赋值,直到p1跑到起始地址的前面去了,就是a的前面去了,循环结束。最后*p = 0,就是给字符串加上结束符'\0'...
越写越乱,既然写了就发出来吧。。。
理解了这两点然后再来看你这道题:
首先*p = a,让p指向数组第一个字符'x',for(;*p;p++);让p不断往后移知道遇到’\0'('\0'的实际值是0),也就是循环结束后p指向了‘\0'。for(p1=p-1;p1>=a;p++,p1--)*p=*p1, 把p1初始化指向'z',然后*p=*p1是用'z'覆盖掉'\0',然后p1--就是p1朝后退一步指向’y', p++就是把p向后移一步指向'z'后面。。。接着赋值,直到p1跑到起始地址的前面去了,就是a的前面去了,循环结束。最后*p = 0,就是给字符串加上结束符'\0'...
越写越乱,既然写了就发出来吧。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
B 交换位置
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询