我什么时候需要一个带结构的指针

时间:2017-09-29 10:34:52

标签: c pointers

我真的不明白我是否以及何时需要声明指向我的数据结构的指针。

我有两个程序,两个程序都是一样的,但我不知道我应该在哪里需要指针。

以下是计划:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct data
{
    char *ptr;
};

void printStruct( struct data pers );

int main (void)
{
    struct data pers;   // Here pers is not a POINTER

    pers.ptr = malloc(sizeof (char) * 256);
    strcpy(pers.ptr, "Hello World");

    printStruct(pers);
    free(pers.ptr);
}

void printStruct( struct data pers ){
    printf("PTR = %s\n", pers.ptr);
}

我什么时候需要一个指针?

如您所见,这里struct data pers;我声明了一个变量,在下一个例子中我使用的是指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct data
{
    char *ptr;
};

void printStruct( struct data *pers );

void printStruct( struct data *pers ){
    printf("PTR = %s\n", pers->ptr);
}

int main (void)
{
    struct data *pers;   // Here pers is a POINTER
    pers = malloc(sizeof(*pers));
    pers->ptr = malloc(sizeof (char) * 256);
    strcpy(pers->ptr, "Hello World");

    printStruct(pers);

    free(pers->ptr);
    free(pers);
}

1 个答案:

答案 0 :(得分:4)

有四种情况, 使用指向struct的指针:

  1. 您希望函数写入struct类型的参数:
    struct foo { int member; }
    
    void updateFoo( struct foo *bar )
    {
      bar->member = some_new_value();
    }
    
    int main( void )
    {
      struct foo f = {0};
      ...
      updateFoo( &f );
    }
    
  2. 您想要动态分配一个或多个struct类型的实例:
    struct foo *farr = malloc( sizeof *farr * NUM_ELEMENTS );
    
  3. 您正在使用具有灵活数组成员的struct类型:
    struct foo { int x; char y[]; }
    
    struct foo *instance = malloc( sizeof *instance + LENGTH_FOR_Y_MEMBER );
    
  4. 您想要定义自引用类型(即struct foo的每个实例都指向struct foo的不同实例:
    struct list_node { int data; struct list_node *next; }
    
    这是单链表的常见实现 - 列表的每个元素都明确指向列表中的下一个元素(如果在最后一个元素,则为NULL)。

你也可以选择将一个指向struct的指针传递给一个函数,即使该函数没有修改参数,只是为了节省在被调用函数中创建副本的开销,特别是如果struct类型很大:

struct ginormous { /* define many large members here */ };

void blah( const struct ginormous *g )
{
  // do stuff with g
}