免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: albert_wzh
打印 上一主题 下一主题

[C] 指针运算问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-11-17 16:56 |只看该作者
回复 10# albert_wzh


    *s++输出结果是 est
你确定?
你代码和上面是一致的?

论坛徽章:
0
12 [报告]
发表于 2011-11-17 16:58 |只看该作者
回复 10# albert_wzh

这是绝对不可能的。

论坛徽章:
0
13 [报告]
发表于 2011-11-17 17:09 |只看该作者
回复 11# keytounix


    代码修改后是:
include <stdio.h>
main()
{
char *s="test";
while(*s!='\0')
printf("%c",*s++);
}
重新编译后现在是输出test了
多谢指点,另外能否请教一下,如果这里我定义为 char *s[]={"test","again"}, 那么进行*s++后s是不是指向again这个字符串?如果是的话是怎么运算的,这两个字符串的长度不一样,编译器怎样判断++是加多少个偏移量?s++(不带*号)又该怎么理解?

论坛徽章:
0
14 [报告]
发表于 2011-11-17 17:27 |只看该作者
本帖最后由 keytounix 于 2011-11-18 11:29 编辑

回复 13# albert_wzh
  1. #include <unstd,h>

  2.    int main(int n,char *v[])
  3. {
  4. int i=0;
  5. while(i<n)
  6. {
  7. printf("arg[%d]=%s\n",i,v[i]);
  8. }
  9. return 0;
  10. }
复制代码
假设这个代码编译后得到test文件
#./test arg1 arg2

运行后的结果是
arg[0]=./test
arg[1]=arg1
arg[2]=arg2

也就是说

v存放的是指向字符串i的指针
现在知道 v[1],v[2]了吧?
他实际就是初始化的那些字符串的首地址的值

那么s[0]="test"字符串的地址咯
s[1] = "again"字符串的地址咯
*s就是s[0]
s++后

*s就是s[1]

s++怎么理解呢?
因为s是char *类型

假设s的值为2010
可以用printf("s=%p",s)看到的哦
从s地址开始的4字节空间存放的数据就是"test"字符串的地址

sizeof(char *)=4
s++就是
s+1*sizeof(typeof(s))=2014


那么从2014开始这4个字节的空间存放的数据就是 "again"字符串的地址

但是s++是不能通过编译的

个人意见,如果有错欢迎大家指正

论坛徽章:
0
15 [报告]
发表于 2011-11-17 17:54 |只看该作者
我写了段代码测试
include <stdio.h>
main()
{
char *s[]={"test","again"};
printf("%s", *(s+1));
printf("%s", *s+1);
}
得到的结果是
again
est
这么看来的话,s+1应该是s所指向的指针作一整个字符串的偏移,然后*取值得到again
*s直接是取的第一个字符串的第一个字符的地址的值,+1后就是e这个字符
但有一点还是想不明白,为什么加上printf("%s",*s++);后,代码无法编译,编译器提示说非法+运算
望高手赐教

论坛徽章:
0
16 [报告]
发表于 2011-11-17 18:02 |只看该作者
本帖最后由 keytounix 于 2011-11-17 18:05 编辑
我写了段代码测试
include
main()
{
char *s[]={"test","again"};
printf("%s", *(s+1));
printf("% ...
albert_wzh 发表于 2011-11-17 17:54

1.
*s+1是一个地址
这个地址开始存放的数据是字符串est
这个地址存放的数据是e
这个我是支持你的

2 .数组是不能自+操作的

char **p;
p=&s;
你这下试一试*p++,应该能编译了

论坛徽章:
0
17 [报告]
发表于 2011-11-17 18:13 |只看该作者
回复 16# keytounix


    这段代码确实可以编译运行了
include <stdio.h>
main()
{
char *s[]={"test","again"};
char **p=&s;
printf("%s",*(s+1));
printf("%s",*p++);
}
输出结果是
again
test

这还是没明白为什么*s++无法通过编译,*p++是对整个数组进行偏移计算,那么我想像*s+1或者*s+n那样取数组中一个字符的值,能否使用一个循环进行++运算呢?

论坛徽章:
0
18 [报告]
发表于 2011-11-17 18:22 |只看该作者
本帖最后由 keytounix 于 2011-11-17 18:36 编辑

回复 17# albert_wzh


数组变量是不能++操作的
你可以简单地理解数据变量就是一个常量
常数怎么可能实现++运算呢?

所以s++这个是不行的
比如 1++这个,不能通过

但是(s+1)
这个就好像(1+1)一样
可以通过

论坛徽章:
0
19 [报告]
发表于 2011-11-17 22:59 |只看该作者
最佳答案:

  1. man printf
复制代码
不过这个之前看 何为指针

论坛徽章:
0
20 [报告]
发表于 2011-11-19 13:57 |只看该作者
楼主在读大一吧?正在学C language
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP