amsdecember
amsdecember

Reputation: 31

What Is The Meaning Behind '(const struct namect*)' Within Function Declarations?

I'm confused about the syntax of struct namect * within the function declarations of getinfo, makeinfo, showinfo and cleanup.

Normally I'd expect that a variable name would follow the asterisk ante-ceding "namect" to create a pointer to a structure namect. Does this simply mean that the argument passed to the function is a pointer to data of type struct namect?

// names3.c -- use pointers and malloc()
#include <stdio.h>
#include <string.h>   // for strcpy(), strlen()
#include <stdlib.h>   // for malloc(), free()
#define SLEN 81
struct namect {
    char * fname;  // using pointers
    char * lname;
    int letters;
};

void getinfo(struct namect *);        // allocates memory
void makeinfo(struct namect *);
void showinfo(const struct namect *);
void cleanup(struct namect *);        // free memory when done
char * s_gets(char * st, int n);

int main(void)
{
    struct namect person;

    getinfo(&person);
    makeinfo(&person);
    showinfo(&person);
    cleanup(&person);

    return 0;
}

void getinfo (struct namect * pst)
{
    char temp[SLEN];
    printf("Please enter your first name.\n");
    s_gets(temp, SLEN);
    // allocate memory to hold name
    pst->fname = (char *) malloc(strlen(temp) + 1);
    // copy name to allocated memory
    strcpy(pst->fname, temp);
    printf("Please enter your last name.\n");
    s_gets(temp, SLEN);
    pst->lname = (char *) malloc(strlen(temp) + 1);
    strcpy(pst->lname, temp);
}

void makeinfo (struct namect * pst)
{
    pst->letters = strlen(pst->fname) +
    strlen(pst->lname);
}

void showinfo (const struct namect * pst)
{
    printf("%s %s, your name contains %d letters.\n",
           pst->fname, pst->lname, pst->letters);
}

void cleanup(struct namect * pst)
{
    free(pst->fname);
    free(pst->lname);
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;

    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');   // look for newline
        if (find)                  // if the address is not NULL,
            *find = '\0';          // place a null character there
        else
            while (getchar() != '\n')
                continue;          // dispose of rest of line
    }
    return ret_val;
}

Upvotes: 2

Views: 132

Answers (3)

Yes. The function declaration void getinfo(struct namect *); (for example) just says:

  1. The argument is a pointer to data of type struct namect.
  2. The argument name will be specified later in the function definition.

In void showinfo(const struct namect *);, the declaration says:

  1. Imagine a structure of type struct namect.
  2. Imagine a constant of the above type (once set, it can't be changed).
  3. Imagine a pointer to the above constant structure. (Note - the pointer isn't a constant, a slightly different syntax can make a pointer to be constant, I won't mention it here.)
  4. The argument name will be specified later in the function definition.

Upvotes: 0

0___________
0___________

Reputation: 67476

void getinfo(struct namect *);

It is called function prototype and it informs the compiler that somewhere in the code there is a definition of the function called getinfo which takes one parameter of type "pointer to struct namect" and does not return anything.

This information compiler needs to call this function correctly.

i'm just confused as to why void getinfo(struct namect *); isnt void getinfo(struct namect * pointer_name);

The pointer_name is not required in the function prototype. But you can also declare it as

void getinfo(struct namect * pointer_name);

Both versions are correct.

Upvotes: 2

Alexander
Alexander

Reputation: 63167

Since there is no typedef struct namect namect;, only struct namect exists. There is no namect.

Thus, const struct namect * is just a non-constant pointer to a constant struct namect.

Upvotes: 2

Related Questions