Простая инициализация массива указателей в C:советы и рекомендации
Указатель — это переменная, в которой хранится адрес другой переменной. Имя переменной-указателя должно начинаться с символа «*». Как и в случае с обычной переменной, мы также можем объявить «массив указателей», где каждый индекс массива содержит адрес типа массива.
Как инициализировать массив указателей в C?
Переменную-указатель можно инициализировать во время объявления, присвоив ей адрес существующей переменной. В следующем фрагменте показано, как инициализировать указатель –
int x = 10; int *y = &x;
По умолчанию все переменные, включая переменные указателя, относятся к «классу автоматического хранения». Это означает, что переменная-указатель будет хранить непредсказуемый, мусорный, случайный адрес памяти, что может привести к неопределенному поведению и потенциальным рискам для программы, таким как ошибки сегментации. Следовательно, его следует инициализировать значением NULL, если у нас нет конкретного значения для хранения во время объявления.
int *ptr = NULL;
«Массив указателей» хранит адрес в каждом элементе. Тип массива должен совпадать с типом целевой переменной.
Инициализировать массив указателей, используя статическое ключевое слово
Вы также можете использовать ключевое слово static для инициализации массива указателей для хранения «0» в каждом индексе.
Пример
#include <stdio.h>
int main(){
static int *ptr[5];
for (int i = 0; i < 5; i++){
printf("ptr[%d] = %d\n", i, ptr[i]);
}
return 0;
}
Вывод
Запустите код и проверьте его вывод –
ptr[0]= 0 ptr[1]= 0 ptr[2]= 0 ptr[3]= 0 ptr[4]= 0
Инициализировать массив целочисленных указателей
Здесь мы объявляем массив целочисленных указателей и сохраняем адреса трех целочисленных переменных.
Пример
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
int *ptr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
Вывод
Запустите код и проверьте его вывод –
ptr[0]: address: 6422040 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422032 value: 30
Инициализировать массив указателей по прямым адресам
Мы можем хранить адрес каждого элемента обычного массива в соответствующем элементе массива указателей.
Пример
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr[3] = {&arr[0], &arr[1], &arr[2]};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
Вывод
Запустите код и проверьте его вывод –
ptr[0]: address: 6422032 value: 10 ptr[1]: address: 6422036 value: 20 ptr[2]: address: 6422040 value: 30
Обход массива по его базовому адресу
Когда мы получаем базовый адрес массива (в данном случае «&arr[0]»), мы можем получить адреса его последующих элементов, зная, что указатель увеличивается на размер типа данных.
Следовательно, используя только базовый адрес (имя массива совпадает с адресом 0-го элемента), мы можем пройти по массиву.
Пример 1
Взгляните на следующий пример –
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr=arr;
for (int i = 0; i < 3; i++){
printf("ptr[%d]: address: %d value: %d\n", i,ptr+i, *(ptr+i));
}
return 0;
}
Вывод
Запустите код и проверьте его вывод –
ptr[0]: address: 6422020 value: 10 ptr[1]: address: 6422024 value: 20 ptr[2]: address: 6422028 value: 30
Пример 2. Обход двумерного массива с помощью массива указателей
В этом примере у нас есть 2D-массив. Адрес 0-го элемента каждой строки хранится в массиве указателей. При перемещении адрес сохраняется в каждом элементе массива указателей и указывает на 0-й элемент соответствующей строки, каждый из которых увеличивается для получения значений в каждой строке.
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int (*ptr)[4] = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", *(ptr[i]+j));
}
printf("\n");
}
return 0;
}
Вывод
Когда вы запустите этот код, он выдаст следующий результат –
1 2 3 4 5 6 7 8
Пример 3
На самом деле нам здесь не нужен массив указателей, поскольку мы можем использовать имя этого 2D-массива в качестве базового указателя и увеличивать его по строкам и столбцам, чтобы получить элементы в данном 2D-массиве –
#include <stdio.h>
int main(){
// 2d array
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// pointer
int *ptr = arr;
// print the element of the array via pointer ptr
for (i = 0; i < ROWS; i++){
for (j = 0; j < COLS; j++){
printf("%d ", *(ptr + i * COLS + j));
}
printf("\n");
}
return 0;
}
Вывод
Вывод аналогичен предыдущему коду –
1 2 3 4 5 6 7 8
Инициализировать массив указателей символов (строка)
В программировании на языке C строка представляет собой массив данных типа char. Поскольку имя массива также представляет адрес его 0-го элемента, строку можно объявить как —
char arr[] = "Hello";
Используя обозначение указателя, строка присваивается указателю char как –
char *arr = "Hello";
Затем мы можем объявить массив указателей char для хранения нескольких строк следующим образом:
char *arr[3] = {"string1", "string2", "string3", . . . };
Пример
В следующем примере представлен массив указателей char, который используется для хранения названий компьютерных языков –
#include <stdio.h>
int main(){
char *langs [10] = {
"PYTHON", "JAVASCRIPT", "PHP",
"NODE JS", "HTML", "KOTLIN", "C++",
"REACT JS", "RUST", "VBSCRIPT"
};
for(int i = 0; i < 10; i++)
printf("%s\n", langs[i]);
return 0;
}
Вывод
Когда вы запустите этот код, он выдаст следующий результат –
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
В этой программе «langs» — это указатель на массив из 10 строк. Следовательно, если «langs[0]» указывает на адрес 5000, то «langs + 1» будет указывать на адрес 5004, в котором хранится указатель на вторую строку.
Следовательно, мы также можем использовать следующий вариант цикла для печати массива строк —
for (int i = 0; i < 10; i++){
printf("%s\n", *(langs + i));
}
Инициализация динамического массива указателей
Вы можете использовать функцию malloc() для динамического объявления и инициализации массива указателей.
Пример
Взгляните на следующий пример –
#include <stdio.h>
int main(){
int *arr = (int *)malloc (sizeof (int) * 5);
for(int i = 0; i < 5; i++){
arr[i] = i;
}
for (int x = 0; x < 5; x++){
printf("%d %d\n", x, arr[x]);
}
return 0;
}
Вывод
Когда вы запустите этот код, он выдаст следующий результат –
0 0 1 1 2 2 3 3 4 4
Вы даже можете запросить ввод данных пользователем и присвоить значения элементам указателя массива –
for(i = 0; i < 5; i++){
scanf("%d", &x);
arr[i] = x;
}
Язык C
- C - Обработка ошибок
- C++ для цикла
- С# Enum (перечисление) с примером
- C# Hello World:первая консольная прикладная программа
- С# — Структуры
- С# — Структура программы
- Указатели в C:что такое указатели в программировании на C? Типы
- C Вход Выход (ввод/вывод)
- Управление памятью C++:создание и удаление
- Учетная запись Microsoft:безопасный доступ и управление