关于c语言中字符串指针变量的问题

main()
{
char *ps="this is a book";
int n=10;
ps=ps+n ;
printf("%s\n",ps);
}
最后输出结果竟然是book
这个让我不明白
ps(赋值以后依然是指针变量 还是字符串的首地址 ) 可是以字符串的形式输出以后竟然是原来字符串book 应该是地址转换为字符串怎么还是book 这到底是不是地址转换成字符串的表现
如果是 那请高手告诉我是如何转换的
我看了大家的回答
我想是我问得不清楚
我是好奇
字符串指针变量(字符串的首地址) 以字符串形式输出以后为什么会和 字符串指针变量的内容是一样的

ps指向"this is a book"的首地址,即第一个元素,但是指针有一个运算就是 加法运算,
ps + 1 就是 ps的地址 + sizeof(Char) , 后面的sizeof(char)就是偏移地址,C++只所以提供指针的加法运算,这与汇编语言中的offset是一样的。 ps = ps + 10; 就相当于 ps + sizeof(char) * 10,就是加10个字符的地址,它的内容就是字符'b' 没事可以到0x30 百度贴吧 耍耍,这些都是很基础的东西哦。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-28
这里没有类型转换的内容,指针就是存放地址的,
你执行char *ps="this is a book"语句时,系统将字符串第1个地址存放
到ps变量中,后面让这个地址自加10个字节,于是地址是字符串中b的地址.
printf语句的意思就是打印从某个地址开始的字符串,直到字符串结尾.
无论ps指向字符串还是其他的数据类型,printf都会把这个地址开始的数据
当成字符串来打印.
字符串指针变量的意思就是你在ps=ps+n;时加的是n个字符的地址,如果
ps定义成int *型的,假设int占4个字节,ps=ps+n;那么ps中存放的地址就会
加10*4而不是10*1了.
总之,字符型指针不一定就指的是字符,它指向谁不会有强制类型转换的
动作发生.
第2个回答  2013-02-28
楼主你好

字符指针ps赋值后是字符串"this is a book"的首地址 也就是说此时ps指向第一个字符't'
*ps就是't'

n=10;
ps=ps+n;
就是使指针ps指向字符串"this is a book"的第11个字符 也就是'b'

那么
printf("%s\n",ps);
就是输出以ps为首的 以'\0'结束的字符串"book"

希望能帮助你哈本回答被网友采纳
第3个回答  2013-02-28
字符指针ps赋值后是字符串"this is a book"的首地址 也就是说此时ps指向第一个字符't'
*ps就是't'
n=10;
ps=ps+n;
就是使指针ps指向字符串"this is a book"的第11个字符 也就是'b'
那么
printf("%s\n",ps);
就是输出以ps为首的 以'\0'结束的字符串"book"
ps 是一个指针,指向那个字符串,后来指针+10,所以就指到了后面的字符
第4个回答  2013-03-01
这个指针型变量的内容并不是"this is a book" 而是"this is a book"的第一个字符的地址付给ps,在print的时候,系统先输出它所指向的第一个字符数据,然后自动使ps加1,直到'\0'结束。

关于字符串和指针的问题
D。C语言不支持在声明多个变量的同时,在一个句子中连续用=来初始化的这种形式。24。B A错。“ABCDE”加上隐藏的结束符,需要char s[6]才能放得下 C错。s指向的是常量字符串,不能赋值 D错。s未初始化,指向的是未知空间 27。C A错。s是数组,p是指针,虽然在使用上没差别,但毕竟是两个...

C语言里为什么字符指针变量指向的字符串常量中的内容是不可取代的?
指向字符串常量的话,这段常量字符串是存储在静态存储区的,内容不能修改。当然你可以让指针指到别的地方

C语言问题:指针变量,数组名,字符串常量的区别。
指针变量p中的内容是: s[0]的地址(&s[0])一个是字符串 一个是地址 不一样 (C)s数组长度和p所指向的字符串长度相等 s数组长度包括 '\\0'的位置 p所指向的字符串长度不包括 '\\0'的位置 s数组长度 == p所指向的字符串长度 + 1 (1就是'\\0'占有的位置)显然 不相等 ...

C语言中字符指针的问题 char *pointer = "Hello World!"; printf...
回答:这里的 pointer 指向的是一个字符串,字符串的首地址赋给 pointer printf("%s\\n",pointer); \/\/输出Hello World!\/\/ printf 遇到指向字符串的指 \/\/针时,输出字符串(就是这样定义的) printf("%s\\n",*pointer); \/\/输出H printf("%d\\n",pointer); \/\/输出pointer指向的地址

C语言中的指针问题到底是怎么回事~
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如: 例二: 1。 char a[20]; 2。 int *ptr=a; ... ... 3。 ptr++; 在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样...

C语言字符型变量的问题
正确答案C,分析:A,绝对错误,c只能容纳一个 字符 ,'97'这是一种语法错误,没有这种 写法 B,错误,c只是一个 字符变量 ,不能容纳一个 字符串 指针 的地址 D,错误同B C,你可以理解为将 数值 97转换为ASCII对应为97的字符'a'然后赋值给c ...

C语言指针变量问题
C语言里面的指针和数组是很有趣的。例如定义数组a[10],你可以通过a[1]访问里面的元素,也可以通过*(a+1),来访问。为什么这里可以这样用呢?ptr的类型为(int *),所以ptr在内存里面存放的就是int类型的指针,指向了某个int地址。正常情况下,你可以通过ptr访问它指向的某一个地址里面的数据,如...

关于C语言中,指针变量与char int double等变量分配内存的问题??
指针:一类类型的统称。指针类型的实例是表达式,可能是一个对象。有时候把指针对象简称为指针,注意不要混淆。左值和右值:表达式中的左值具有对象语义,而右值没有。通俗点说左值可以出现在赋值操作符=的左边,而右值不可以(C语言中右值可以简单地理解成值)。&操作符作用于一个左值,获得一个右值指针...

C语言中变量指针输出问题
假设字符串"this is a book"的地址分布如下:值 地址 t 0030F8B0 h 0030F8B1 i 0030F8B2 ... ...此时有char *ps="this is a book"; 由于ps是char类型指针变量,它的指针域只能保存地址,我们知道"this is a book"是一个字符串数组且拿到了首元素的地址就可以找到它整个字...

c语言中,为什么不能对字符指针变量指向的字符串再赋值?
因为C语言中,凡是以""括住的形式直接出现,而且你又没有为其分配内存空间的字符串都是常量字符串,是不能修改其值的。这样:char a[6]="hello";a[2]='c';就可以了。这里你为hello分配了一个长度为6的字符数组空间来存放。

相似回答