Um momento
0x80Lesson 9 of 15

Arrays

Store many values of the same type side by side in memory, and loop over them safely.

14 min 5-question quiz 2 code exercises
By the end of this lesson you can
  • Declare, initialize and index arrays
  • Loop over an array without going out of bounds
  • Pass arrays to functions along with their length

An array is a fixed number of values of the same type, stored one after another in memory. Instead of score1, score2, score3... you write int scores[3] and reach each one by its index.

scores.c
1#include <stdio.h>
2
3int main(void) {
4    int scores[5] = {90, 72, 85, 64, 99};
5
6    printf("First: %d\n", scores[0]);
7    printf("Last: %d\n", scores[4]);
8
9    scores[1] = 75;   // change an element
10    printf("Second is now %d\n", scores[1]);
11    return 0;
12}
Output
First: 90
Last: 99
Second is now 75

Indexes start at zero

An array of 5 elements has indexes 0 to 4. The index is really an offset: "start of the array, plus this many elements". So scores[0] is the first element and scores[4] the last. There is no scores[5].

Looping over an array

The standard loop visits indexes 0 up to, but not including, the length. You can compute the length of an array (in the same function where it is declared) with sizeof:

average.c
1#include <stdio.h>
2
3int main(void) {
4    int scores[] = {90, 72, 85, 64, 99};
5    size_t count = sizeof scores / sizeof scores[0];
6
7    int total = 0;
8    for (size_t i = 0; i < count; i++) {
9        total += scores[i];
10    }
11    printf("%zu scores, average %.1f\n", count, (double)total / count);
12    return 0;
13}
Output
5 scores, average 82.0

With an initializer you can leave the size empty (int scores[] = {...}) and the compiler counts for you. If you give a size and fewer values, the rest are set to zero: int counts[26] = {0}; is the idiomatic way to zero an array.

Arrays and functions

When you pass an array to a function, C does not copy it. The function receives the address of the first element, which has an important consequence: inside the function, sizeof can no longer tell you the length. So you always pass the length as a separate parameter. It also means a function can modify the caller's array.

max.c
1#include <stdio.h>
2
3int find_max(const int values[], size_t length) {
4    int best = values[0];
5    for (size_t i = 1; i < length; i++) {
6        if (values[i] > best) {
7            best = values[i];
8        }
9    }
10    return best;
11}
12
13int main(void) {
14    int data[] = {3, 41, 7, 26, 9};
15    printf("Max: %d\n", find_max(data, 5));
16    return 0;
17}
Output
Max: 41

Two-dimensional arrays

int grid[3][4]; is 3 rows of 4 columns. Access elements with two indexes, grid[row][col], and loop with nested for loops. In memory it is still one flat run of 12 ints, row after row.

Key takeaways

  • An array of N elements has indexes 0 to N-1. C never checks bounds for you.

  • Loop with for (size_t i = 0; i < length; i++). Get the length with sizeof array / sizeof array[0] where the array is declared.

  • Arrays passed to functions are not copied: pass the length separately, and use const if the function should not modify it.

Lesson quiz

5 questions · pass with 4 correct · up to 50 XP

Passing this quiz completes the lesson and keeps your streak going. Questions you miss come back in review sessions later.

Practice: write real C

These run for real. Write the program, press Run tests, and read what the compiler tells you - learning to read compiler messages is half of learning C.

Exercise 1

Print in reverse

+25 XP

Read 5 integers into an array, then print them in reverse order separated by spaces, followed by a newline.

For input 1 2 3 4 5 print 5 4 3 2 1.

  • 1 2 3 4 5
  • Mixed numbers
main.c
Loading editor…

Your code is compiled with gcc 14 (-Wall -Wextra) and run on Compiler Explorer (godbolt.org), a free public service.

Exercise 2

Above average

+25 XP

The first number in the input is n (at most 100), followed by n integers. Print how many of them are strictly greater than their average.

For 5 then 1 2 3 4 10 the average is 4, so the answer is 1.

  • 1 2 3 4 10
  • All equal
  • Half above
main.c
Loading editor…

Your code is compiled with gcc 14 (-Wall -Wextra) and run on Compiler Explorer (godbolt.org), a free public service.

Questions about this lesson

Stuck? Ask. Figured something out? Share it. Explaining is one of the best ways to learn.

Sign in to ask questions, help other learners, and earn XP for taking part.

Loading posts…

Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: