Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Простая инициализация массива указателей в 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

  1. C - Обработка ошибок
  2. C++ для цикла
  3. С# Enum (перечисление) с примером
  4. C# Hello World:первая консольная прикладная программа
  5. С# — Структуры
  6. С# — Структура программы
  7. Указатели в C:что такое указатели в программировании на C? Типы
  8. C Вход Выход (ввод/вывод)
  9. Управление памятью C++:создание и удаление
  10. Учетная запись Microsoft:безопасный доступ и управление