Введение
Нуль-указатель - это указатель, который не указывает на какой-либо адрес в памяти. В программировании на C нуль-указатель представляется константой NULL, которая определена в заголовочном файле stdio.h. Использование нулевого указателя может помочь избежать ошибок и добавить функциональность в программы на C.
В этом практическом занятии вы узнаете о нулевых указателях и о том, как их использовать в программировании на C. Вы создадите программу, которая использует нулевые указатели для поиска имен в массиве.
Примечание: вам нужно самостоятельно создать файл
~/project/main.c, чтобы практиковаться в написании кода и узнать, как компилировать и запускать его с использованием gcc.
cd ~/project
## создать main.c
touch main.c
## скомпилировать main.c
gcc main.c -o main
## запустить main
./main
Объявить нулевой указатель
В программировании на C нулевой указатель - это указатель, который не указывает ни на что. Чтобы объявить нулевой указатель, вы можете присвоить значение NULL переменной-указателю.
#include <stdio.h>
int main() {
int *ptr = NULL; // ptr - нулевой указатель
return 0;
}
Объявить указатель void
Указатель void (указатель без типа) — это указатель, который не имеет определенного типа данных. Он может указывать на данные любого типа. Для объявления указателя void используйте ключевое слово void перед звездочкой (*).
Указатель void должен быть приведен (cast) к другому типу данных, прежде чем его можно будет разыменовать или использовать для арифметики указателей.
#include <stdio.h>
int main() {
int n = 10;
void *ptr = &n; // ptr — это указатель void, указывающий на int
printf("Value of n: %d\n", *(int*)ptr); // приведение к указателю int перед разыменованием
return 0;
}
Использовать нулевой указатель для отметки конца массива указателей
В программировании на C вы можете использовать нулевой указатель для отметки конца массива указателей. Это может быть полезно при поиске имен или других данных в массиве.
#include <stdio.h>
#include <string.h>
int search(char *ptr[], char* name);
char *names[] = {
"John",
"Peter",
"Thor",
"Chris",
"Tony",
NULL
};
int main(void)
{
if(search(names, "Peter")!= 1)
{
printf("Peter is in the list.\n");
}
if(search(names, "Scarlett") == -1)
{
printf("Scarlett not found.\n");
}
return 0;
}
// определите функцию поиска
int search(char *ptr[], char*name)
{
for(int i=0; ptr[i]; ++i)
{
if(!strcmp(ptr[i], name))
{
return i;
}
}
return -1; // имя не найдено
}
Настроить программу для ввода пользователем
Вы можете настроить программу для того, чтобы пользователь мог вводить имена для массива и искать имена. Это можно сделать с использованием функции scanf() в программировании на C.
#include <stdio.h>
#include <string.h>
#define MAX_NAMES 100
int search(char *ptr[], char* name);
int main(void)
{
char *names[MAX_NAMES];
char name[50];
int count = 0;
printf("Введите имена (нажмите Enter для завершения):\n");
// получаем имена из ввода пользователя
while(1)
{
scanf("%s", name);
if(strcmp(name, "") == 0)
{
break;
}
names[count] = (char*) malloc(strlen(name)+1);
strcpy(names[count], name);
count++;
}
names[count] = NULL; // помечаем конец массива нулевым указателем
// ищем имена
while(1)
{
printf("Введите имя для поиска (нажмите Enter для завершения):\n");
scanf("%s", name);
if(strcmp(name, "") == 0)
{
break;
}
int index = search(names, name);
if(index!= -1)
{
printf("%s найдено в индексе %d.\n", name, index);
}
else
{
printf("%s не найдено.\n", name);
}
}
return 0;
}
// определяем функцию поиска
int search(char *ptr[], char*name)
{
for(int i=0; ptr[i]; ++i)
{
if(!strcmp(ptr[i], name))
{
return i;
}
}
return -1; // имя не найдено
}
Резюме
В этом практическом занятии вы узнали о нулевых указателях и о том, как их использовать в программировании на C. Вы увидели, как объявить нулевой указатель и указатель void, а также как использовать нулевой указатель для отметки конца массива указателей. Вы также узнали, как настроить программу для ввода пользователем и поиска имен с использованием нулевых указателей. Используя нулевые указатели в своих программах, вы можете сделать их более надежными и избежать распространенных ошибок.



