c语言指针与字符数组?

#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;//换行

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-10
s代表的字符串在内存中存储为"dlrow,olleh\0"
&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是什么呢?

本回答被网友采纳
第2个回答  2019-12-10
字符数组由若干元素组成,每个元素存放一个字符,数组是在内存中开辟了一段空间存放字符串
第3个回答  2019-12-12
我试过了
printf("%c\n",*(s));
输出 d,即是字符串的 第一个字符追问

整个程序运行是到过来输出的

第4个回答  2019-12-12

代码文本:

#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;

}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网