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

main(){char*ps="thisisabook";intn=10;ps=ps+n;printf("%s\n",ps);}这个程序的输出printf("%s\n",... 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输出的才应该是字符变量本身,求解释 求解释!!
展开
 我来答
仙戈雅3n
2015-03-02 · TA获得超过5790个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:875万
展开全部
假设字符串"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.
cdyzxy
推荐于2018-03-22 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:84%
帮助的人:3628万
展开全部
这和printf用%s的规则相关。
首先ps是一个指向字符型数据的指针;printf用%s修饰输出时需要提供一个指针,这个指针指向的数据是字符型的,但printf将按照字符串的规则来进行输出,也就是输出完这个指针指向的字符后,自动将指针加1,并判断指向的字符是否为0,否则将输出直至指向的数据为0为止,或者说找到字符串结束标志为止。
所以我们说,如果用%s修饰输出是输出字符串,printf("%s\n",ps);,这句话要求提供一个指针
而要输出单个字符的话应当用printf("%c\n",*ps);这时要求提供一个字符型数据,用*ps表示ps指向的字符数据正好。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
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这个地址)
地址非法 当然报错退出
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cqdjyy01234
2015-03-02 · TA获得超过1147个赞
知道小有建树答主
回答量:267
采纳率:50%
帮助的人:302万
展开全部
#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的参数。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
CodeBlove
2015-03-02 · TA获得超过3363个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:237万
展开全部
ps的值就是字符串首地址,如果用*ps只表示第一个字符。另外printf 、scanf等函数内部都支持字符串,所以不必在费心考虑取地址还是取值问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式