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, i.e., does this disprove our assumption of this case?
CodePudding user response:
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.
CodePudding user response:
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.
CodePudding user response:
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.
CodePudding user response:
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;.
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.
