难以解释这个处理指针的C示例

时间:2016-10-14 17:33:53

标签: c string pointers

我无法理解输出是什么

int main( ) {
        int x = 5, y = 10, z = 20;
        int *ptr1 = &x, *ptr2 = &y, *ptr3 = &z;
        *ptr2 = *ptr3 + *ptr1;
        ptr2 = ptr1;
        *ptr2 = *ptr3;
        printf("%d and %d and %d\n", x,y,z);

        /*char str[] = "Stackoverflow is kind.";
        int len = strlen(str);
        printf("%s and %d\n", str, len);

        char *p;
        p = str;
        printf("%c and %c and %c and %c\n",
                   *p, str[3], *(p+9), str[len-2]);*/
    return 0;
}

第一条添加线是否会被允许?我以为你无法添加指针。这两行之间会有什么区别?

ptr2 = ptr1;
*ptr2 = *ptr3;

显然它们是不同的指针,但它们的功能有何不同?

我已经运行了该计划并获得了20 25 20但我不明白如何

3 个答案:

答案 0 :(得分:2)

在这里,您可以将x y和z的地址分配给这三个指针:

int *ptr1 = &x, *ptr2 = &y, *ptr3 = &z;

运算符*用于表示指针。 Dereferencing a pointer means getting the value that is stored in the memory location pointed by the pointer. The operator * is used to do this, and is called the dereferencing operator.

所以你基本上将值1和3加在一起:

*ptr2 = *ptr3 + *ptr1;
*ptr2 = 20 + 5 -> 25

然后,你让ptr2指向与ptr1相同的地址,所以它们都指向相同的值,即5:

ptr2 = ptr1;

最后,你将ptr2指向的值更改为ptr3指向的值,使其变为20.但请记住ptr2和ptr1指向同一地址,因此ptr1和ptr2的值现在为20:

*ptr2 = *ptr3;

答案 1 :(得分:1)

执行行

int x = 5, y = 10, z = 20;
int *ptr1 = &x, *ptr2 = &y, *ptr3 = &z;

以下条件属实:

 ptr1  == &x
*ptr1  ==  x ==  5
 ptr2  == &y
*ptr2  ==  y == 10
 ptr3  == &z
*ptr3  ==  z == 20

因此,表达式 *ptr1表达式 x相同,*ptr2与{{1}相同所以行

y

没有添加指针值,它正在添加指针指向的对象的值 - IOW,这相当于写

*ptr2 = *ptr3 + *ptr1;

在第

y = x + z;

您将ptr2 = ptr1; 设置为与ptr2相同的值,这意味着它会将同一个对象指向ptr1。在此行之后,以下条件都是正确的:

ptr1

最后,行

 ptr2 ==  ptr1 == &x
*ptr2 == *ptr1 ==  x == 10

*ptr2 = *ptr3; 指向的对象(ptr2)的值设置为x指向的对象的值(ptr3); IOW,这相当于写作

z

所以,在整个计划过程中:

x = z;

因此你的输出。

答案 2 :(得分:0)

在这一行:

*ptr2 = *ptr3 + *ptr1;

您没有添加指针。您正在添加指针指向的内容。在这种情况下,它与y = z + x相同。

ptr2int *类型的指针,而*ptr2的类型为int