#include<stdio.h>
#define s "dlrow,olleh"
int main()
{
int i;
for(i=2;i<13;i++)
putchar(*((char *)(&s+1)-i));
}
问一下这个程序是怎么实现那些字符的倒转的?
这个时候&s指向字符串的第一个字符的地址,所以屏幕上输出的是d。
&s+1后,p指针的地址直接跳到了字符串的最后'\0',这个时候屏幕上输出是'\0'。
注意这个位置的标志。(p-2)是常量,不是变量。因为字符串在前面定义的常量。屏幕上的输出h。并且在d与h之间有一个空白,因为前面输出一个字符'\0'。
追问问一下你用的是什么编译器
怎么能看这些东西的
你好,不对呀我弄个字符数组也是这样的
你说的对,我忽视这样的一种形式。
(1) &s+1 (2)&s[0]+1
这里的(1)与(2)是两种不同的地址+1的形式。你的定义可以用&s[0]+1,前面的不行。因为他的s被定义为 s代表"hello"。这个是常量。因此这里的s不可能取s[0]+1这种形式。
我用的编译器
你好,还是不对呀,改成你那样就输出空白了
定义数组和直接用define都是一样的吧,&s这个应该是数组首地址再取地址,但是我理解不了这个
追答cp = (char *) (&s);
cout<<"cp=(char*)(&s)字符=";//<<endl;
printf("%c",*cp);
cout<<""<<endl;//换行
cp = (char *) (&s+1);
cout<<"cp=(char*)(&s+1)字符=";//<<endl;
printf("%c",*cp);
cout<<""<<endl;//换行
cp = (char *) (&s+1)-2;
cout<<"cp=(char*)(&s+1)-2字符=";//<<endl;
printf("%c",*cp);
这里有一个运算顺序。(char*) (&s+1) ,这个式了先算地址+1。实际上是字符串的长度+1。(char*)先合这个结合,因此就是字符变量的宽度+1。实际是就是"hello"的个数+1。
cout<<""<<endl;//换行
&s+1指向s的终止符\0之后的一个字符
当i=2时,(&s+1)-i相当于回退两格,指向s的最末一个字符h,依次逆序输出追问
&s+1指向s的终止符\0之后的一个字符
&s+1指向s的终止符\0之后的一个字符
这是为什么呢?
追答因为编译会把它以指针运算的规则来处理。给你一个更明显的例子作参照(注意a+1和&a+1的效果是不一样的):
int a[5] = { 1, 12, 3, 4, 15 };
int *p = (int *)(&a + 1); // +1则加了5个元素,p指向a[5],即15之后的一个已经越界的元素
// 输出12,15
printf("%d, %d\n", *(a + 1), *(p - 1)); // a+1,则加1个元素;p-1,则减1个元素
a是数组的首地址,那么&a是什么呢?
本回答被网友采纳printf("%c\n",*(s));
输出 d,即是字符串的 第一个字符追问
整个程序运行是到过来输出的
倒
代码文本:
#include "stdio.h"
#include <string.h>
#define s "dlrow,olleh"
int main(int argc,char *argv[]){
int n;
for(n=strlen(s)-1;n>=0;printf("%c",s[n--]));
putchar('\n');
return 0;
}