C语言中变量指针输出问题

main(){
char *ps="this is a book";
int n=10;
ps=ps+n;
printf("%s\n",ps);
}

这个程序的输出 printf("%s\n",ps) 难道不应该是printf("%s\n",*ps);吗? ps输出的应该是字符变量的地址啊, *ps输出的才应该是字符变量本身,求解释 求解释!!

假设字符串"this is a book"的地址分布如下:

值 地址
t 0030F8B0
h 0030F8B1
i 0030F8B2
... ...

此时有char *ps="this is a book"; 由于ps是char类型指针变量,它的指针域只能保存地址,我们知道"this is a book"是一个字符串数组且拿到了首元素的地址就可以找到它整个字符串,所以ps的指针域保存了首字符的地址即t的地址0030F8B0,而格式输出符%s,就是输出字符串之意,即从t开始输出直至遇到\0符为止。

如果有printf("%c\n",*ps); 则取ps所指向的地址0030F8B0的值即字符t,换句说就是ps代表指针域即地址0030F8B0,再加上“*”就是取值的意思,合起来就是取地址0030F8B0的值即字符t.
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-22
这和printf用%s的规则相关。
首先ps是一个指向字符型数据的指针;printf用%s修饰输出时需要提供一个指针,这个指针指向的数据是字符型的,但printf将按照字符串的规则来进行输出,也就是输出完这个指针指向的字符后,自动将指针加1,并判断指向的字符是否为0,否则将输出直至指向的数据为0为止,或者说找到字符串结束标志为止。
所以我们说,如果用%s修饰输出是输出字符串,printf("%s\n",ps);,这句话要求提供一个指针
而要输出单个字符的话应当用printf("%c\n",*ps);这时要求提供一个字符型数据,用*ps表示ps指向的字符数据正好。本回答被网友采纳
第2个回答  2015-03-02
printf()函数是一个可变参数的函数 编译时它根本不知道它需要多少个参数(必须一个以上) 和参数的类型 只能在运行时确定 如何确定? 第一个参数灰常重要(char *) 它定义了后面接着多少个参数 和参数类型,printf函数通过分析字符串 是否含有 %c %s 这些内容 就可以知道后面的参数个数和类型
%s 表示参数是char* 类型的 也就是一个字符串的首地址 对 它只得到一个开始的地址 它没有结束得到的地址 那printf如何确定字符在哪里结束(或者它有多少长?) 答案显而易见 字符串后面的0
当然你可以不传入一个地址
printf("%s",10);
10不是一个有效的地址 printf知道它是有效还是没有效的吗? 它不知道 它只能傻傻地去访问10这个地址 最终程序崩溃退出
printf("%s",",*ps);
传递给printf的是什么? ps里面的值! printf分析第一个参数的知道它需要一个char* 类型的参数
把ps的值看成是地址 而去访问ps的值表示的地址(ps里如果是'A' 对应的65这个地址)
地址非法 当然报错退出
第3个回答  2015-03-02
#include <stdio.h>

int main() {
    char *ps = "this is a book";
    int n = 10;
    
    printf("地址:%p\n", ps);
    printf("字符串:%s\n", ps);
    printf("字符:%c\n", *ps);

    ps = ps + n;
    printf("地址:%p\n", ps);
    printf("字符串:%s\n", ps);
    printf("字符:%c\n", *ps);

    return 0;
}

注意printf的参数。

第4个回答  2015-03-02
ps的值就是字符串首地址,如果用*ps只表示第一个字符。另外printf 、scanf等函数内部都支持字符串,所以不必在费心考虑取地址还是取值问题。

相关了解……

你可能感兴趣的内容

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