| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 668 人关注过本帖
标题:谁能告诉我为什么?
只看楼主 加入收藏
xiaoqi0110
Rank: 2
等 级:论坛游民
帖 子:55
专家分:52
注 册:2010-8-15
结帖率:85.71%
收藏
已结贴  问题点数:10 回复次数:9 
谁能告诉我为什么?
    printf函数在输出的表列项时直接加变量名就可以了,为什么scanf函数要加取地址呢?printf函数也可以理解为从这个变量的地址开始读取输出数据啊!
   
    还有就是好像看到书上说的  对一个字符数组(比如char  a[]),如果printf("%o\n",a)则输出地址,如果printf("%s\n",a)就输出字符串  为什么第一个是输出地址而不是将字符数组里的内容的0101当作八进制整数内容输出呢?
搜索更多相关主题的帖子: 八进制 字符串 
2011-04-27 17:54
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
只管用就可以啦!

   唯实惟新 至诚致志
2011-04-27 18:53
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
其实吧  呵呵  我也不知道  我只会用

                                         
===========深入<----------------->浅出============
2011-04-27 19:17
xiaoqi0110
Rank: 2
等 级:论坛游民
帖 子:55
专家分:52
注 册:2010-8-15
收藏
得分:0 
这是我今天敲程序时忽然发现的一个问题!!!
2011-04-27 19:24
boxinchao
Rank: 4
等 级:业余侠客
帖 子:51
专家分:231
注 册:2011-4-13
收藏
得分:0 
很简单,函数就是这么定义的。你的问题有点像1+1为什么等于2,因为人们对2的定义就是2=1+1

printf("<格式化字符串>", <参量表>);
scanf("<格式化字符串>", <地址表>);
2011-04-27 19:41
chenwei435
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:322
专家分:1611
注 册:2010-11-28
收藏
得分:5 
这个东西其实学习指针的时候,你就应该发现的。
分析下,我们说的变量名,其实编译后不再有了,编译后其实就是一个地址了,我们说a=3,就是把3这个数放到a这个地址里去,也就是说,我们如果说给a赋值,其实就是把什么东西放到a这个地址里去,我们看&a我们说是a的地址。那为什么要这么说呢,我们为什么不先定义一个指针int *p,然后p=a,呢,经过上面的分析,我们发现,如果这样用的话,那p不是赋值给a的值了吗?,所以用&a表示地址,用a表示读取a这个地址的值,或者把数值存储到a这个地址里去。
而你所说的char  a[],如果printf("%o\n",a)则输出地址,如果printf("%s\n",a);其实后面的printf("%s\n",a);只不过是c语言的一种语法,规定了%s是输出以a为首地址到\0结束的字符串。而你以%o,或者%d 输出的就是地址,因为a就是一个地址。
2011-04-27 19:43
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:2 
其实吧,你看看下面的代码和运算结果,更加难以理解。不过吧,这个代码是很有欺骗性的,你所想的难以理解其实并不像你想的那样

程序代码:
#include <stdio.h>

int
main ()
{
    char s[4][4];
    int i;
    s[0][0] = 'a';
    s[1][0] = 'b';
    s[2][0] = 'c';
    s[3][0] = 'd';
    printf ("\n&s    = %x  *s   = %x\n", (int) &s, (int) *s);
    for (i = 0; i < 4; i++)
        printf ("&s[%d] = %x  s[%d] = %x  &s[%d][0] = %x  s[%d][0]=%x == '%c'\n",
                i, (int) &s[i], i, (int) s[i],     i, (int) &s[i][0], i, 
                (int) s[i][0], s[i][0]);
    char *p = s;
    *p = 'e';
    printf ("\nAfter doing this: char *p = s; *p = 'e';\n\n");
    printf ("&s    = %x  *s   = %x\n", (int) &s, (int) *s);
    printf ("&s[0] = %x  s[0] = %x  &s[0][0] = %x  s[0][0]=%x == '%c'\n",
            (int) &s[0], (int) s[0], (int) &s[0][0], 
            (int) s[0][0], s[0][0]);
    printf ("p %s s  *p %s *s\n\n", (int) p == (int) s ? "==" : "!=", 
            (int) *p == (int) *s ? "==" : "!=");
    return 0;
}
2011-04-27 19:53
程式化
Rank: 2
等 级:论坛游民
帖 子:8
专家分:11
注 册:2010-12-18
收藏
得分:3 
printf函数的实现可是很复杂的哦,看看吧:

printf 函数的实现
//acenv.h
typedef char *va_list;
#define _AUPBND    (sizeof (acpi_native_int) - 1)
#define _ADNBND    (sizeof (acpi_native_int) - 1)
            
#define _bnd(X, bnd)  (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T)  (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap)   (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
//start.c
static char sprint_buf[1024];
int printf(char *fmt, ...)
{
  va_list args;
  int n;
  va_start(args, fmt);
  n = vsprintf(sprint_buf, fmt, args);
  va_end(args);
  write(stdout, sprint_buf, n);
  return n;
}
//unistd.h
static inline long write(int fd, const char *buf, off_t count)
{
  return sys_write(fd, buf, count);
}
或许对你有帮助
2011-04-30 19:01
BYSF_XF
Rank: 2
等 级:论坛游民
帖 子:89
专家分:75
注 册:2011-4-25
收藏
得分:0 
学了指针就知道了
2011-05-01 12:37
xiaoqi0110
Rank: 2
等 级:论坛游民
帖 子:55
专家分:52
注 册:2010-8-15
收藏
得分:0 
谢谢大家了!!!
2011-05-02 02:20
快速回复:谁能告诉我为什么?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020184 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved