这个输出怎么样?

时间:2013-12-23 18:43:15

标签: c pointers pointer-arithmetic

#include <stdio.h>
#include <string.h>
int main() {
 char str_a[20]; 
 char *pointer; 
 char *pointer2; 
 strcpy(str_a, "Hello, world!\n");
 pointer = str_a; 
 printf(pointer);
 pointer2 = pointer + 2;
 printf(pointer2); 
 strcpy(pointer2, "y you guys!\n"); 
 printf(pointer); 
}

嗨..你能告诉我输出结果如何:=

Hello, world! 
llo, world! 
Hey you guys!

实际上我是C.的新手。所以发现它有点难以掌握。任何关于指针的帮助都将受到高度赞赏。谢谢。

4 个答案:

答案 0 :(得分:4)

第一个:

pointer = str_a; 
printf(pointer);

pointer指向“Hello,wold!\ n”(str_a),以便打印出来的内容。

第二个:

pointer2 = pointer + 2;
printf(pointer2); 

pointer2指向pointer之后的2个字符,这是“Hello,wold!\ n”的第三个字符,因此打印llo world

第三个:

strcpy(pointer2, "y you guys!\n"); 
printf(pointer); 

现在,你将'你们'复制到pointer2中的地址,这仍然是pointer中的两个字符,所以字符串的前两个字符仍然是相同的。

memory: H  e  l  l  o  ,     w  o  r  l  d  \  n
        ^     ^
pointer-+     |
pointer2------+
来自strcpy(pointer2, "y you guys!\n");

pointer2覆盖,例如第一个'l'

答案 1 :(得分:0)

第一个strcpy将引用的字符串常量复制到str_a缓冲区中。然后通过指向其开始的指针打印缓冲区。 pointer2设置为将两个字符指向缓冲区,而不是pointer(两者都是指向char的类型),然后打印第三个字符的缓冲区内容。

第二个strcpy将引用的字符串从第三个字符开始复制到缓冲区中并覆盖先前的内容。请注意,前两个字符未被覆盖,因此当写出缓冲区的全部内容时,它们会显示出来。

答案 2 :(得分:0)

指针是数字(通常是32位系统上的4个字节,64位系统上的8个字节),表示逻辑存储器中的地址。例如,如果你有4GiB的内存可用,你的指针将包含从0到4294967295的值。你可以在C中指向不同类型的东西。指针的类型不会影响它存储的地址,但它确实会影响它将如何递增。 int *a; a += 1;会将a增加4个字节,或者可能增加8个字节,具体取决于系统int的大小。

  1. strcpy(str_a, "Hello, world!\n");将包含"Hello, world!\n"的缓冲区复制到str_a,这是指向20 char的指针。 C中的数组只是从数组地址开始预先分配内存的指针。
  2. pointer = str_a;使pointer指向与str_a相同的地址。
  3. pointer2 = pointer + 2;使pointer2在与pointer相同的字符串中指向两个字符。
  4. strcpy(pointer2, "y you guys!\n");使用新文本替换str_apointer中存储的原始字符串的前两个字符,因为这是pointer2现在指向的位置。

答案 3 :(得分:0)

首先,不使用printf说明符,使用%s打印字符串是不好的做法。
现在关于这个问题;

声明

 strcpy(str_a, "Hello, world!\n");  

会将字符串"Hello, world!"复制到str_a

 pointer = str_a;  

会将该字符串分配给pointerpointer指向字符串的第一个char,即H

 printf(pointer);  

将打印字符串"Hello, world!"

  pointer2 = pointer + 2;  

将向pointer添加2个单位,现在pointer2将指向字符串char的第三个"Hello, world!",即l(拳头) )。现在pointerpointer2指向相同的字符串"Hello, world!"但具有不同的起始地址。现在

 strcpy(pointer2, "y you guys!\n");  

会将"y you guys!\n"复制到pointer2,字符串"llo, world!"将变为"y you guys!"。由于指向指针对象的指针所做的任何更改都会反映到指向它的所有指针,因此现在原始字符串"Hello, world!"将成为现在"Hey you guys!"和语句

printf(pointer); 

将打印Hey you guys!