免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1049 | 回复: 8
打印 上一主题 下一主题

不好意思的问个低级问题!:) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-17 12:01 |只看该作者 |倒序浏览

  1. include <stdlib.h>;

  2. size_t
  3. stringlen( char *string )
  4. {
  5.     int length = 0;

  6.     while ( *string++ != '\0' )
  7.         length++;

  8.     return length;
  9. }

  10. main( void )
  11. {
  12.     char *p = "The c program";

  13.     printf( "%d\n", stringlen( p ) );
  14.     printf( "%s\n", p );
复制代码

运行结果:
  1. 13
  2. The c program
复制代码


函数stringlen( p )返回时,指针变量string指向了字符串的结束字符'\0',也就是p也指向了'\0',而非指向字符串首字符。为什么printf( "%s\n", p );语句还能打印完整的字符串?

论坛徽章:
0
2 [报告]
发表于 2005-06-17 12:25 |只看该作者

不好意思的问个低级问题!:)

相当于
char *String;
String=p;
String++;
p不会变

论坛徽章:
0
3 [报告]
发表于 2005-06-17 12:32 |只看该作者

不好意思的问个低级问题!:)

我觉得可以这样来看char *p, 把它写成char* p,这样,p其实就是一个指针型变量,所以,在调用函数stringlen(char* string)时,其实是做得值拷贝传递,所以,在函数中修改string的值并不会影响到p的值如果这样写这个程序,就会出现你期望的效果了。
  1. size_t
  2. stringlen( char* *string )
  3. {
  4.    int length = 0;

  5.    while ( *(*string)++ != '\0' )
  6.        length++;

  7.    return length;
  8. }

  9. main( void )
  10. {
  11.    char* p = "The c program";

  12.    printf( "%d\n", stringlen( &p ) );
  13.    printf( "%s\n", p );

  14. }
复制代码

结果为:
  1. 13

复制代码

因为此时传递的是指向p的指针,在其中修改string指向的值,就会修改p的指向了。
这就是指针传递,可以用于修改指针指向的地址的值,但是不能修改指针自身。

论坛徽章:
0
4 [报告]
发表于 2005-06-17 12:56 |只看该作者

不好意思的问个低级问题!:)

哈哈,那是一份拷贝
woxinfeixiang 该用户已被删除
5 [报告]
发表于 2005-06-17 13:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2005-06-17 13:24 |只看该作者

不好意思的问个低级问题!:)

+楼主感觉和我以前犯的错误一样。
if(a>;a[j])
{
   t=a;
   a[j]=a;
   a[j]=t;
}    身在其中不知哪不对劲。
楼主的函数中,p只是把数值传递给了sting.所移动的指针式string而不是p

我不知道说明白没,楼主在想想,自己想通了最好。

论坛徽章:
0
7 [报告]
发表于 2005-06-17 15:32 |只看该作者

不好意思的问个低级问题!:)

传递的是地址值,实质上还是值的单向传递,string的内容改变不影响p的值!
  1. #include <stdio.h>;
  2. #include <string.h>;


  3. int main( void )
  4. {
  5.    char *p = "p:The c program";
  6.    char *q = "q:The c program";
  7.    int length = 0;
  8.    
  9.    printf( "%d\n", strlen( p ) );
  10.    printf( "%s\n", p );

  11.    while ( *p++ != '\0' )
  12.        length++;
  13.    printf( "%d\n", strlen( p ) );
  14.    printf( "%s\n", p );
  15.    
  16.    
  17.    return 0;
  18. }
复制代码

这个就有影响了。VC6.0下运行。

论坛徽章:
0
8 [报告]
发表于 2005-06-17 15:33 |只看该作者

不好意思的问个低级问题!:)

现在基本有点明白了:

  1. 当用指针变量作为函数实参时,传递给形参的实际是该指针存放的地址值。函数可以更改该地址存放的内容,但无法更改指针本身。(如我的第一个例子)
  2. 如果采用指针的指针作函数实参传递,那么函数得到的也是一个地址值。函数同样可以操作该地址存放的内容,只不过该内容此时是一个指针。最终的效果相当于可以更改指针本身。(如Kevinkw的例子)
复制代码

论坛徽章:
0
9 [报告]
发表于 2005-06-17 16:06 |只看该作者

不好意思的问个低级问题!:)

函数参数传递,分传地址和传值,楼主的函数虽然传的是指针,但对于该地址而言,还是属于传值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP