A text file can be thought of as a 2D grid of characters (lines x columns) If a single array is linear, i.e. 1 dimensional, then an array of arrays is 2 dimensional (i.e. 2D). An array of array is defined by adding a second [] subscript:
[]
char data[rows][cols]; data = { {'.','.',... cols ...,'.'}, ┐ {'.','.',... cols ...,'.'}, ├── rows ... │ {'.','.',... cols ...,'.'} ┘ }
rows and cols should normally be constant values, however C allows dynamic arrays:
char data[LINES][COLS];
Note: You may not attempt to initialize a dynamic sized array however.
A single character can then be accessed in almost the same way that screen coordinate would be:
data[y][x] = '#'; // places '#' at row y, column x in the 2D data array.
The amount of space required for the array is rows * cols * sizeof(char).
rows * cols * sizeof(char)
If the last subscript ([x]) is omitted, then data[y] is the string of characters at row y. i.e.:
[x]
data[y]
y
printf("%s", data[y]);
// Define outside of a function: #define MAXLINES 200 #define MAXCOLS 120 // Inside of a function: // Open the file (for reading): FILE *fp = fopen("file.txt", "r"); // Define space for the rows and columns of data: int lines[MAXLINES][MAXCOLS]; int line = 0; // Read a line at at time from the file: while(fgets(lines[line], MAXCOLS, fp) != NULL) { line++; if (line >= MAXLINES) break; // Stop when there is no more room in the array. }
A pointer is a variable that points to a storage area rather than defining a storage area itself. Pointers can be incremented to move to the next available storage area in memory as well.
A pointer variable is defined with a leading *:
*
char *str; // A string (character) pointer int *nums; // An integer pointer char *strs[10]; // An array of 10 string pointers. int **x; // A pointer to a pointer to an integer.
A pointer can be thought of an used like an array, however it does not allocate space for any data by itself:
char s[10]; \ These are not the same, although they can be used in the char *s; / same way. char s1[] = "text"; char *s2 = "text";
In this case s1 allocates space for "text\0" which is copied into it, data in s1 can be modified. s2 points to a read-only version of "text\0", which can be read, but not modified.
s1
"text\0"
s2
To access the second character in s1 or s2, you can use the array index method:
s1[1] == 'e' s2[1] == 'e'
For s2 however you can use the * operator to "dereference" the pointer and get the data that it points to:
*s2 == 't' same as *(s2+0) == 't' *(s2+1) == 'e' *(s2+2) == 'x' ...
int strlen(char *s) { int len = 0; while (*s != '\0') { len++; s++; // Move pointer to the next character } return len; }