如何在结构中使用指针?

how to use pointers in structures?

我在打印结构元素时使用了指针,但它在打印语句中没有使用指针的情况下工作,但我们不应该使用指针从变量地址收集元素为什么它在结构情况下不同而在字符串中不同还 。谁能告诉我这是为什么?

#include <stdio.h>

int main(){
    struct books{
        char name[10];
        int page;
    };
    struct books b1={"book1",1};
    struct books *ptr;
    ptr=&b1;
    printf("%s %d",ptr->name,ptr->page);

}
    printf("%s %d",*ptr->name,*ptr->page);

错了。 A->B 表示 (*A).B。你应该做任何一个

    printf("%s %d",ptr->name,ptr->page);

    printf("%s %d",(*ptr).name,(*ptr).page);

MikeCAT 说的。

注意数组也可能是指针,因此 *ptr->name 可以编译但会生成 'name' 的第一个字符。

struct books{
    char name[10];
    int page;
};

ptr=&b1;
printf("%c",*ptr->name);

当对象太大时使用指针,复制这样的对象会浪费时间。但是在您的结构中,char 数组需要 10 个字节 + int 需要 4 个字节,这不是问题。在 64 位机器指针中占用 8 个字节,在 32 位中占用 4 个字节。假设你有一个很大的结构,每个对象需要 50 字节的内存,如果你复制它将花费更多 space 并且会更慢并且通过复制将创建一个全新的对象并且不会改变任何内容原来的。

让我们实际看看什么时候可以使用指针:

#include <stdio.h>

struct person{
    char name[10];
    int age;
};

void grow(struct person p) {
    ++p.age;
}

int main(){
    struct person Mike = { "Mike", 20 };

    grow(Mike);

    printf("Name: %s\tAge: %d", Mike.name, Mike.age);
}

输出:

Name: Mike Age: 20

此代码不会更改 Mike 的年龄,因为 void grow(struct person p) 函数通过创建新对象复制 struct person,然后增加年龄并在最后销毁 struct person p。如果您将其作为指针传递,则 Mike 将被修改。