(Arrays as Fields): New section. Add to menus.
(Structure Assignment): Give examples about array fields.
This commit is contained in:
parent
1ea6251e83
commit
3b8ad07e1a
62
c.texi
62
c.texi
|
@ -332,6 +332,7 @@ Pointers
|
||||||
Structures
|
Structures
|
||||||
|
|
||||||
* Referencing Fields:: Accessing field values in a structure object.
|
* Referencing Fields:: Accessing field values in a structure object.
|
||||||
|
* Arrays as Fields:: Accessing field values in a structure object.
|
||||||
* Dynamic Memory Allocation:: Allocating space for objects
|
* Dynamic Memory Allocation:: Allocating space for objects
|
||||||
while the program is running.
|
while the program is running.
|
||||||
* Field Offset:: Memory layout of fields within a structure.
|
* Field Offset:: Memory layout of fields within a structure.
|
||||||
|
@ -5776,6 +5777,7 @@ GNU C does not require this.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Referencing Fields:: Accessing field values in a structure object.
|
* Referencing Fields:: Accessing field values in a structure object.
|
||||||
|
* Arrays as Fields:: Accessing field values in a structure object.
|
||||||
* Dynamic Memory Allocation:: Allocating space for objects
|
* Dynamic Memory Allocation:: Allocating space for objects
|
||||||
while the program is running.
|
while the program is running.
|
||||||
* Field Offset:: Memory layout of fields within a structure.
|
* Field Offset:: Memory layout of fields within a structure.
|
||||||
|
@ -5858,6 +5860,36 @@ struct @{ double d; struct intlistlink l; @} foo;
|
||||||
@r{@dots{}}foo.l.next->next->datum@r{@dots{}}
|
@r{@dots{}}foo.l.next->next->datum@r{@dots{}}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
@node Arrays as Fields
|
||||||
|
@section Arrays as Fields
|
||||||
|
|
||||||
|
When you declare field in a structure as an array, as here:
|
||||||
|
|
||||||
|
@example
|
||||||
|
struct record
|
||||||
|
@{
|
||||||
|
char *name;
|
||||||
|
int data[4];
|
||||||
|
@};
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
Each @code{struct record} object holds one string (a pointer, of
|
||||||
|
course) and four integers, all part of a field called @code{data}. If
|
||||||
|
@code{recptr} is a pointer of type @code{struct record *}, then it
|
||||||
|
points to a @code{struct record} which contains those things; you can
|
||||||
|
access the second integer in that record with @code{recptr->data[1]}.
|
||||||
|
|
||||||
|
If you have two objects of type @code{struct record}, each one contains
|
||||||
|
an array. With this declaration,
|
||||||
|
|
||||||
|
@example
|
||||||
|
struct record r1, r2;
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@code{r1.data} holds space for 4 @code{int}s, and @code{r2.data} holds
|
||||||
|
space for another 4 @code{int}s,
|
||||||
|
|
||||||
@node Dynamic Memory Allocation
|
@node Dynamic Memory Allocation
|
||||||
@section Dynamic Memory Allocation
|
@section Dynamic Memory Allocation
|
||||||
@cindex dynamic memory allocation
|
@cindex dynamic memory allocation
|
||||||
|
@ -6397,6 +6429,36 @@ a = b; /* @r{Error!} */
|
||||||
|
|
||||||
@xref{Assignment Expressions}.
|
@xref{Assignment Expressions}.
|
||||||
|
|
||||||
|
When a structure type has a field which is an array, as here,
|
||||||
|
|
||||||
|
@example
|
||||||
|
struct record
|
||||||
|
@{
|
||||||
|
char *name;
|
||||||
|
int data[4];
|
||||||
|
@};
|
||||||
|
|
||||||
|
struct record r1, r2;
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
structure assigment such as @code{r1 = r2} copies array fields'
|
||||||
|
contents just as it copies all the other fields.
|
||||||
|
|
||||||
|
This is the only way in C that you can operate on the whole contents
|
||||||
|
of a array with one operation: when the array is contained in a
|
||||||
|
@code{struct}. You can't copy the contents of the @code{data} field
|
||||||
|
as an array, because
|
||||||
|
|
||||||
|
@example
|
||||||
|
r1.data = r2.data;
|
||||||
|
@end data
|
||||||
|
|
||||||
|
@noindent
|
||||||
|
would convert the array objects (as always) to pointers to the initial
|
||||||
|
elements of the arrays (of type @code{struct record *}), and the
|
||||||
|
assignment would be invalid because the left operand is not an lvalue.
|
||||||
|
|
||||||
@node Unions
|
@node Unions
|
||||||
@section Unions
|
@section Unions
|
||||||
@cindex unions
|
@cindex unions
|
||||||
|
|
Loading…
Reference in New Issue