鱼C论坛

 找回密码
 立即注册
查看: 3225|回复: 10

C语言关于数组与指针

[复制链接]
发表于 2012-8-4 14:01:23 | 显示全部楼层 |阅读模式
10鱼币
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. char str1[]={"hello_world"};
  6. char str2[]={".none"};
  7. char tmp[8];
  8. char *p = NULL;
  9. int i=0,k=0;
  10. int n;

  11. n = strlen(str1)-1;

  12. p = &str1[n]; //p指向str1的最后一个字符

  13. while( *p != '.'){p--;k++;} //使p指向str1中的字符'.'


  14. //然后将字符'.' 与其后的字符存入tmp数组中
  15. for(i=0;i<=k;i++,p++)
  16. {
  17. tmp[i] = *p;
  18. }

  19. tmp[i+1] = '\0';

  20. printf("%s",tmp);

  21. return 0;
  22. }
复制代码

问题是,为什么最后输出的是  str2 数组的内容,明明 p是指向 数组  str1  的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-4 14:01:24 | 显示全部楼层
  1. #include<stdio.h>

  2. #include<string.h>

  3. int main()

  4. {
  5.        
  6.         char str1[]={"hello_world"};
  7.        
  8.         char str2[]={".none"};
  9.        
  10.         char tmp[8];
  11.        
  12.         char *p = NULL;
  13.        
  14.         int i=0,k=0;
  15.        
  16.         int n;
  17.        
  18.        
  19.         n = strlen(str1)-1;
  20.        
  21.        
  22.         p = &str1[n]; //p指向str1的最后一个字符
  23.        
  24.        
  25.         while( *p != '.'){p--;k++;} //使p指向str1中的字符'.'        你的str1有字符 . 吗?
  26.        
  27.        
  28.        
  29.         //然后将字符'.' 与其后的字符存入tmp数组中
  30.        
  31.         for(i=0;i<=k;i++,p++)                //当执行到这部的时候 p已经指向了数组str2的首地址咯   k的值为18咯
  32.                
  33.         {
  34.                
  35.                 tmp[i] = *p;                //这里把数组 str2 的字符 分别赋值给 数组 tmp
  36.                
  37.         }
  38.        
  39.        
  40.         tmp[i+1] = '\0';
  41.        
  42.        
  43.         printf("%s\n",tmp);                //所以你这里打印出来的是 数组str2的 字符
  44.        
  45.        
  46.         return 0;
  47.        
  48. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-4 14:26:09 | 显示全部楼层
str1里不是没有“.”吗  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:33:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-4 15:58:45 | 显示全部楼层
把他们的地址打印出来啊,printf("%d,%d",str1,str2);  str2的地址低于str1的,p--,一直减到str2上去了,,也就是说两个字符串地址之间没有.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-4 16:17:09 | 显示全部楼层
楼主最好自己调试一下看看,就清楚了,要看清楚它们的内存地址和变量初始化的位置,还有tmp它的分配不够大在后面的 tmp[i]  是很危险的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-4 19:23:33 | 显示全部楼层
楼上说的是对的,我大致补充一点,  这两个字符串在内存中的排列情况,然后你就明白了。。。。。。。。。。
你这样初始化一个字符数组,就跟  char * str1 = "Hello_World" ,这样是一样的。这样初始化的时候,其实字符串是存放在堆里面,跟全局变量差不多,他们之间的排列顺序是这样的,str1在高地址,我的编译器上地址是
00422020  2E 6E 6F 6E  .non
00422024  65 00 00 00  e...
00422028  68 65 6C 6C  hell
0042202C  6F 5F 77 6F  o_wo
00422030  72 6C 64 00  rld.  就是这样,  具体我也不详细说了,一看这个你估计也明白了吧。。

为什么p会等于18,中间是三个字节用0填充,这样是为了内存对齐。。。然后指针  里面放的地址 你可以一步一步去推算一下。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-5 11:25:29 | 显示全部楼层
本帖最后由 颓废的青春 于 2012-8-5 14:56 编辑
Tzdner_C 发表于 2012-8-4 19:23
楼上说的是对的,我大致补充一点,  这两个字符串在内存中的排列情况,然后你就明白了。。。。。。。。。。 ...


说到 初始化字符数组,我想问一下,可不可以这样初始化:  unsigned int str1【】={“thank you”};
如果可以,那么怎样对字符串进行操作?如果不行,请解释一下原因。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 12:59:27 | 显示全部楼层
不对,p指向的只是str1数组中的最后一个元素而已,它只是存了str1最后一个元素的地址,在while循环执行的时候,只要*p的值不是“.”,程序就会继续执行“p--”,直到遇见“.”,此时p所指向的地址就是“.”的地址,不会还不明白吧,O(∩_∩)O哈哈~,祝你好运
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-5 14:54:18 | 显示全部楼层
魁拔 发表于 2012-8-5 12:59
不对,p指向的只是str1数组中的最后一个元素而已,它只是存了str1最后一个元素的地址,在while循环执行的时 ...

是不是说,p指针其实是从str1最后一直跑到str1开头,因为没有找到  '.'  所以就继续向前移动,知道发现str2中的  '.'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 15:37:57 | 显示全部楼层
同意6   7楼大神解释   楼主要多加领会啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 06:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表