简体   繁体   中英

In C, is 'int *' a derived datatype?

Is int * a derived datatype or not?

I got this confusion because I feel that these two cases are contradicting in regard to this question.


case 1: Assumption: int * is to be considered as a derived datatype. then considering this below given code -

void someRandomFunction()
{
    int* a, b, c, d;
    int  e, f, g, h;
    ....
    ....
    ....
}

In this function, if we need to consider int * as a derived datatype, then just like e, f, g, h are variables of int datatype, all the variables a, b, c, d must be pointers pointing to int datatype, right?

But since it is only a which is a pointer pointing to int datatype, so does this disprove our assumption of this case?


Case 2: Assumption: int * is not to be considered as a derived datatype. then considering this below given code -

int* MyFunc()
{
    int *p;
    ....
    ....
    ....
    return p;
}

Here, int * is instructing the return's datatype to the compiler, right? So, Does this prove that int * is a derived datatype, ie, does this disprove our assumption of this case?

Is int * a derived datatype or not?

It is a derived type from the object type int .

if we need to consider int * as a derived datatype, then just like e, f, g, h are variables of int datatype, all the variables a, b, c, d must be pointers pointing to int datatype, right?

If you will introduce the type int * as a type specifier as for example

typedef int * T;

then indeed in this declaration

T a, b, c, d;

all the declared variables have the type int * . Otherwise the symbol * is related to the declarator of the variable a in this declaration

int* a, b, c, d;

that may be rewritten like

int ( * a ), b, c, d;

Pay attention to that declaration is defined like (here is a partial definition of declaration):

declaration:
    declaration-specifiers init-declarator-listopt ;

declaration-specifiers:
    type-qualifier declaration-specifiersopt

init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator

init-declarator:
    declarator
    declarator = initializer

That is in this declaration

int* a, b, c, d;

the common type specifier of all declarators is int and the declarator a has the form *a .

While in this declaration

T a, b, c, d;

the common type specifier is T that represents the derived pointer type int * .

That is the derived pointer type int * is being built from its referenced type int . The derived type int ** is being built from its referenced type int * and so on.

So for example passing by reference in C means passing an object indirectly through another object of its derived pointer type that references the type of the original object.

Ok. We have an fundamental datatypes (int, float, double,...) and we have an derived datatypes and we also have a derived datatypes(fundamental datatype with some extensions).

In your first example int* a, b, c, d; we have an a as a pointer to integer but b, c, d are not pointers to the integers, because they are just integers !

So, yes you are right! int* is derived from the int. Your confusion has started with taking b,c,d also as a pointers but they are not. In C programming language during the variable declaration process if there is an * between variable name and hers datatype than that variable is a pointer to hers datatype.

A derived datatype is a datatype derived from a fundamental datatype. In this case, int * is a derived datatype from int .

Your first analysis is incorrect. Getting b, c, d to have int datatype doesn't say that int * is not a derived datatype. So It's just about how C is working. that's why it's always a good idea to write the declaration like that: int *a, .... so the * is adjacent to the variable, not the type to signalize that any coming variables don't take the * but only the datatype.

Just like the array.

int a[10], b;

here the array is a derived datatype but b has type int doesn't also suggest the array is not a derived datatype.

Arrays, structures, unions, functions, pointers, and atomic types are derived from other types.

int* a, b; is not a way of expressing that b is a pointer type. The grammar of the declaration is such that * binds with a ; the declaration is actually int *a, b; , as if it were int *a; int b; int *a; int b; .

In C, declarations use a basic type, like int , and then describe derived types by using a “picture” of how the type will be used . In int *a; , we are saying that *a will be used as an int . From this, it is deduced that a must be a pointer to an int . Similarly, int *a[3] says that *a[i] will be used as an int , so a[i] must be a pointer to an int , so a must be an array of pointers to int .

Then int *a, b; says *a is an int and b is an int .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM