Browse Source

(Arrays as Fields): New section. Add to menus.
(Structure Assignment): Give examples about array fields.

Richard Stallman 2 năm trước cách đây
mục cha
commit
3b8ad07e1a
1 tập tin đã thay đổi với 62 bổ sung0 xóa
  1. 62 0
      c.texi

+ 62 - 0
c.texi

@@ -332,6 +332,7 @@ Pointers
 Structures
 
 * 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
                                    while the program is running.
 * Field Offset::                 Memory layout of fields within a structure.
@@ -5776,6 +5777,7 @@ GNU C does not require this.
 
 @menu
 * 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
                                    while the program is running.
 * 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{}}
 @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
 @section Dynamic Memory Allocation
 @cindex dynamic memory allocation
@@ -6397,6 +6429,36 @@ a = b;            /* @r{Error!} */
 
 @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
 @section Unions
 @cindex unions