190 likes | 228 Views
C Programming. Lecture 14 Arrays. What is an Array?. An array is a sequence of data items that are: all of the same type a sequence of integers, or a sequence of characters, or a sequence of floats, etc. indexible you can indicate or select the first element or second element or ...
E N D
C Programming Lecture 14 Arrays
What is an Array? • An array is a sequence of data items that are: • all of the same type • a sequence of integers, or a sequence of characters, or a sequence of floats, etc. • indexible • you can indicate or select the first element or second element or ... • stored contiguously in memory • each element of the sequence is stored in memory immediately after the previous element
One-Dimensional Arrays • Declaration of a one-dimensional array. • int grade[3]; • Provides space in memory to store three grades (as in grades on three of your quizzes) • Example of Assignments grade[0] = 95; /* 1st element index is 0 */ grade[1] = 88; /* 2nd element index is 1 */ grade[2] = 97; /* 3rd element index is 2 */
Accessing Array Elements • The following code segment will print the three grades stored in the array on the previous slide (assume i has been declared as an int variable): for (i = 0; i < 3; ++i) printf(“Grade %d is %d\n”, i, grade[i]); • Output Grade 0 is 95 Grade 1 is 88 Grade 2 is 97
958897 Arrays and Pointers • An array name is also the name of a pointer constant to the base address (beginning) of the array in memory. • Using “made up” addresses (as we have before in discussing pointers): 1000 1004 1008 < addresses in memory grade values stored in each element 0 1 2 < index of array element The address stored in grade would be 1000
Using a Symbolic Constant as the Size of the Array • It is considered good programming practice to define the size of an array as a symbolic constant: • In the next example, if the size of a class changes then the symbolic constant at the top of the program is easily changed. • The program would then be recompiled so it can be used with the larger array of grades.
Example of Entering Values into an Array, then Displaying the Values #include <stdio.h> #define N 20 /* Number of students in class */ int main(void) { int grade[N]; /* declare array with N elements */ int i; /* Enter the grades for a quiz */ for (i = 0; i < N; ++i) { printf(“Enter quiz grade %d: “, i + 1); scanf(“%d”, &grade[i]); } /* display the grades that were entered */ printf(“Here are the grades that were entered\n”); for (i = 0; i < N; ++i) printf(“Grade %d is %d”, i + 1, grade[i]); } Note that the user is shown grades starting with grade 1, but what the user thinks of as grade 1 is stored in grade[0] in the array.
Initialization of Arrays As with simple variables, arrays can be initialized within a declaration. • An array initializer is a sequence of initializing values written as a brace-enclosed, comma-separated list. float x[4] = {-1.1, 0.2, 33.0, 4.4}; x[0] is initialized to -1.1 x[1] is initialized to 0.2 etc.
More on Initialization of Arrays • If a list of initializers is shorter than the number of array elements, the remaining elements are initialized to zero. • If an external or static array is not initialized, then the system automatically initializes all elements to zero. • Uninitialized automatic and constantarrays start with garbage values -- whatever happens to be in memory when the array is allocated.
Declaring and Initializing an Array Without a Size • If an array is declared without a size and is initialized to a series of values, it is implicitly given the size of the number of initializers. int a[] = {3, 4, 5, 6}; is equivalent to int a[4] = {3, 4, 5, 6};
Range of ValuesAllowed for a Subscript • Assume a declaration: int i, a[size]; • To access an element of the array, we can write a[expr], where expr is an integral expression. • expr is called a subscript and the value of the subscript must lie in the range 0 to size - 1.
“Subscript Out of Bounds” • If a subscript from the previous example lies outside the range 0 to size - 1 then: • A run-time error occurs. • The system will stop executing your program and display a message such as “subscript out of bounds”. • Sometimes no error message is displayed, but your program will begin to produce unexpected results.
Relationship Between Arrays and Pointers • An array name represents the address of the beginning of the array in memory. • When an array is declared, the compiler must allocate a base address and a sufficient amount of storage (RAM) to contain all the elements of the array. • The base address of the array is the initial location in memory where the array is stored. • It is the address of the first element (index 0) of the array.
Passing Arrays to Functions • In a function definition, a formal parameter that is declared as an array is actually a pointer. • When an array is passed, its base address is passed call-by-value. • The array elements themselves are not copied. • As a notational convenience, the compiler allows array bracket notation to be used in declaring pointers as parameters.
Example of Passing an Array to a Function int sum(int a[], int n) /* n is size of the array */ { int i, s = 0; for (i = 0; i < n; ++i) s += a[i]; return s; } alternative function definition: int sum(int *a, int n) /* n is size of the array */ { int i, s = 0; for (i = 0; i < n; ++i) s += a[i]; return s; } Notice -- no size here. That was provided in the original declaration of the array.
Equivalence of int a[]; and int *a; • As part of the header of a function definition the declaration int a[];is equivalent toint *a; • Within the body of a function, these are not equivalent. • The first will create a constant pointer (and no storage for an array). • The second will create a pointer variable.