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输出的才应该是字符变量本身,求解释 求解释!! 展开
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.
值 地址
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.
展开全部
这和printf用%s的规则相关。
首先ps是一个指向字符型数据的指针;printf用%s修饰输出时需要提供一个指针,这个指针指向的数据是字符型的,但printf将按照字符串的规则来进行输出,也就是输出完这个指针指向的字符后,自动将指针加1,并判断指向的字符是否为0,否则将输出直至指向的数据为0为止,或者说找到字符串结束标志为止。
所以我们说,如果用%s修饰输出是输出字符串,printf("%s\n",ps);,这句话要求提供一个指针
而要输出单个字符的话应当用printf("%c\n",*ps);这时要求提供一个字符型数据,用*ps表示ps指向的字符数据正好。
首先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这个地址)
地址非法 当然报错退出
%s 表示参数是char* 类型的 也就是一个字符串的首地址 对 它只得到一个开始的地址 它没有结束得到的地址 那printf如何确定字符在哪里结束(或者它有多少长?) 答案显而易见 字符串后面的0
当然你可以不传入一个地址
printf("%s",10);
10不是一个有效的地址 printf知道它是有效还是没有效的吗? 它不知道 它只能傻傻地去访问10这个地址 最终程序崩溃退出
printf("%s",",*ps);
传递给printf的是什么? ps里面的值! printf分析第一个参数的知道它需要一个char* 类型的参数
把ps的值看成是地址 而去访问ps的值表示的地址(ps里如果是'A' 对应的65这个地址)
地址非法 当然报错退出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ps的值就是字符串首地址,如果用*ps只表示第一个字符。另外printf 、scanf等函数内部都支持字符串,所以不必在费心考虑取地址还是取值问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询