Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C typedef of pointer to structure

People also ask

How typedef is used in structure?

The C language contains the typedef keyword to allow users to provide alternative names for the primitive (e.g.,​ int) and user-defined​ (e.g struct) data types. Remember, this keyword adds a new name for some existing data type but does not create a new type.

How do you initialize a pointer to a structure?

struct thread_data data; // allocated on the stack // initialize your data. * field by field. struct thread_data* data = malloc(sizeof (struct thread_data)); // allocated on the heap // initialize your data->* field by field. In both cases, you have to allocate your structure first to be able to access its fields.

Is it possible to create an array of pointer to structure?

It is not possible to create an array of pointer to structures.

What is the use of pointer to structure?

Pointer to structure holds the add of the entire structure. It is used to create complex data structures such as linked lists, trees, graphs and so on. The members of the structure can be accessed using a special operator called as an arrow operator ( -> ).


Absolutely valid. Usually, you can take full advantage of this way by defining two types together:

typedef struct
{
 int a;
 int b;
} S1, *S1PTR;

Where S1 is a struct and S1PTR is the pointer to this struct.


Yes it is. But it is imho bad style. Not the direct declaration of the struct, but the direct declaration of a pointer type. It is obfuscation, the information that a given variable or parameter is a pointer (and to a lesser extent for arrays) is extremly important when you want to read code.

When reviewing code it is often difficult to see at first glance which function could have a side effect or not. If the types used hide this information, it adds a memorisation burden to the reader.

int do_fancy(vector a, vector b); 

or

int do_fancy(vector *a, vector *b);

in the first case I can miss easily that that function may change the content of a or b. In the second I'm warned.

And when actually writing code I also know directly to write a->x and not have the compiler tell me error: request for memberx' in something not a structure or union`.

I know, it looks like a personal taste thing, but having worked with a lot of external code, I can assure you that it's extremely annoying when you do not recognize the indirection level of variables. That's one reason I also dislike C++ references (in Java it's not because all objects are passed by reference, it's consistent) and Microsoft's LPCSTR kind of types.


Yes it is valid. If you need more "security" you can also do

typedef struct vector_{
        double x;
        double y;
        double z;
} *vector;

then you can use both

struct vector_ *var;
vector var;

But don't forget the ending semi-colon.

Using only typedef means that you name it that way. otherwise it'd be more or less anonymous.


It a valid one, what it does is it defines a new type. As @Alex said, it would be useful to define a type and pointer type.

You could create more pointers just by using

S1PTR ptr1, ptr2, ptr3, ...;  

instead of

S1 *ptr1, *ptr2, *ptr3, ...;

Yes it is valid as described in above answers. A small suggestion, it would be better if you provide a tag name too, as follows. This would help some IDEs to better parse your code.

typedef struct vactor_tag {
        double x;
        double y;
        double z;
} *vector;