Указатели в C:что такое указатели в программировании на C? Типы
Что такое указатель в C?
Указатель в C это переменная, которая хранит адрес другой переменной. Указатель также может использоваться для ссылки на другую функцию указателя. Указатель может увеличиваться/уменьшаться, то есть указывать на следующую/предыдущую ячейку памяти. Назначение указателя — экономия места в памяти и ускорение выполнения.
Как использовать указатели в C
Если мы объявим переменную v типа int, v фактически сохранит значение.
v теперь равно нулю.
Однако каждая переменная, кроме значения, имеет еще и свой адрес (или, проще говоря, место ее расположения в памяти). Адрес можно получить, поставив амперсанд (&) перед именем переменной.
Если вы напечатаете адрес переменной на экране, он будет выглядеть как совершенно случайное число (более того, от запуска к запуску оно может отличаться).
Давайте попробуем это на практике с указателем в примере C
Вывод этой программы:-480613588.
Итак, что такое указатель? Вместо сохранения значения указатель будет хранить адрес переменной.
Переменная-указатель
Целое *y =&v;
VARIABLEPOINTERA значение хранится в именованном адрес хранения/памяти переменная который указывает адрес хранения/памяти другого переменнаяОбъявление указателя
Как и переменные, указатели в программировании на C должны быть объявлены до того, как их можно будет использовать в вашей программе. Указатели могут называться как угодно, если они подчиняются правилам именования C. Объявление указателя имеет следующую форму.
data_type * pointer_variable_name;
Здесь
- тип_данных является базовым типом указателя для типов переменных C и указывает тип переменной, на которую указывает указатель.
- Звездочка (*:та же звездочка, используемая для умножения), которая является оператором косвенности, объявляет указатель.
Давайте посмотрим на некоторые допустимые объявления указателей в этом руководстве по указателям C:
int *ptr_thing; /* pointer to an integer */ int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */ double *ptr2; /* pointer to a double */ float *ptr3; /* pointer to a float */ char *ch1 ; /* pointer to a character */ float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */
Инициализировать указатель
После объявления указателя мы инициализируем его, как стандартные переменные, с переменным адресом. Если указатели в программировании на C не инициализированы и не используются в программе, результаты будут непредсказуемыми и потенциально катастрофическими.
Чтобы получить адрес переменной, мы используем оператор амперсанда (&), который ставится перед именем переменной, адрес которой нам нужен. Инициализация указателя выполняется с использованием следующего синтаксиса.
Синтаксис указателя
pointer = &variable;
Ниже приведена простая программа для иллюстрации указателя:
#include <stdio.h>
int main()
{
int a=10; //variable declaration
int *p; //pointer variable declaration
p=&a; //store address of variable a in pointer p
printf("Address stored in a variable p is:%x\n",p); //accessing the address
printf("Value stored in a variable p is:%d\n",*p); //accessing the value
return 0;
}
Вывод:
Address stored in a variable p is:60ff08 Value stored in a variable p is:10Оператор Значение * Служит 2 цели
- Объявление указателя
- Возвращает значение указанной переменной
- Возвращает адрес переменной
Типы указателей в C
Ниже приведены различные типы указателей в C. :
Нулевой указатель
Мы можем создать нулевой указатель, присвоив нулевое значение во время объявления указателя. Этот метод полезен, когда у вас нет адреса, назначенного указателю. Нулевой указатель всегда содержит значение 0.
Следующая программа иллюстрирует использование нулевого указателя:
#include <stdio.h>
int main()
{
int *p = NULL; //null pointer
printf(“The value inside variable p is:\n%x”,p);
return 0;
}
Вывод:
The value inside variable p is: 0
Пустой указатель
В программировании на C указатель void также называется универсальным указателем. У него нет стандартного типа данных. Указатель void создается с помощью ключевого слова void. Его можно использовать для хранения адреса любой переменной.
Следующая программа иллюстрирует использование указателя void:
#include <stdio.h>
int main()
{
void *p = NULL; //void pointer
printf("The size of pointer is:%d\n",sizeof(p));
return 0;
} Вывод:
The size of pointer is:4
Дикий указатель
Указатель называется диким указателем, если он ничем не инициализируется. Эти типы указателей C неэффективны, потому что они могут указывать на какое-то неизвестное место в памяти, что может вызвать проблемы в нашей программе и привести к сбою программы. Всегда нужно быть осторожным при работе с дикими указателями.
Следующая программа иллюстрирует использование дикого указателя:
#include <stdio.h>
int main()
{
int *p; //wild pointer
printf("\n%d",*p);
return 0;
} Вывод:
timeout: the monitored command dumped core sh: line 1: 95298 Segmentation fault timeout 10s main
Другие типы указателей в ‘c’:
- Висячий указатель
- Сложный указатель
- Рядом с указателем
- Дальний указатель
- Огромный указатель
Прямые и косвенные указатели доступа
В C есть два эквивалентных способа доступа и управления переменным содержимым
- Прямой доступ:мы используем непосредственно имя переменной
- Косвенный доступ:мы используем указатель на переменную
Давайте разберемся с этим с помощью программы ниже
#include <stdio.h>
/* Declare and initialize an int variable */
int var = 1;
/* Declare a pointer to int */
int *ptr;
int main( void )
{
/* Initialize ptr to point to var */
ptr = &var;
/* Access var directly and indirectly */
printf("\nDirect access, var = %d", var);
printf("\nIndirect access, var = %d", *ptr);
/* Display the address of var two ways */
printf("\n\nThe address of var = %d", &var);
printf("\nThe address of var = %d\n", ptr);
/*change the content of var through the pointer*/
*ptr=48;
printf("\nIndirect access, var = %d", *ptr);
return 0;} После компиляции программы без ошибок результат:
Direct access, var = 1 Indirect access, var = 1 The address of var = 4202496 The address of var = 4202496 Indirect access, var = 48
Арифметика указателей в C
Операции с указателями показаны на следующем рисунке
центр> рисунок> Приоритетная операция (приоритет)
При работе с указателями C мы должны соблюдать следующие правила приоритета:
- Операции * и &имеют тот же приоритет, что и унарные операции (отрицание!, инкрементация++, декремент-).
- В том же выражении унарные операторы *, &,!, ++, – вычисляются справа налево.
Если указатель P указывает на переменную X, то * P можно использовать везде, где можно записать X.
Следующие выражения эквивалентны:
интервал X =10
интервал *P =&Y;
Для приведенного выше кода следующие выражения верны
ВыражениеЭквивалентное ВыражениеY=*P+1
*P=*P+10
*Р+=2Р>
+*P
(*Р)++Р> У=Х+1
Х=Х+10
Х+=2
++ХР>
Х++
В последнем случае необходимы круглые скобки:поскольку унарные операторы * и ++ вычисляются справа налево, без круглых скобок будет увеличиваться указатель P, а не объект, на который указывает P.
В таблице ниже показаны арифметические и основные операции, которые можно использовать при работе с указателями C
Операция Пояснение Назначение*P1,*P2П1=П2;
P1 и P2 указывают на одну и ту же целочисленную переменную Incrementation и decrementationInt *P1;
P1++;P1–;Добавление смещения (Константа) Это позволяет указателю перемещать N элементов в таблице.
Указатель будет увеличен или уменьшен в N раз на количество байт(ов) типа переменной.
Р1+5;
Указатели и массивы C с примерами
Традиционно мы обращаемся к элементам массива, используя его индекс, но этот метод можно исключить, используя указатели. Указатели упрощают доступ к каждому элементу массива.
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5}; //array initialization
int *p; //pointer declaration
/*the ptr points to the first element of the array*/
p=a; /*We can also type simply ptr==&a[0] */
printf("Printing the array elements using pointer\n");
for(int i=0;i<5;i++) //loop for traversing array elements
{
printf("\n%x",*p); //printing array elements
p++; //incrementing to the next element, you can also write p=p+1
}
return 0;
}
Вывод:
1 2 3 4 5
Добавление определенного числа к указателю переместит положение указателя на значение, полученное операцией сложения. Предположим, что p — это указатель, который в данный момент указывает на ячейку памяти 0, если мы выполним следующую операцию сложения, p+1, тогда она будет выполняться следующим образом:
центр> рисунок>
Поскольку p в настоящее время указывает на ячейку 0 после добавления 1, значение станет равным 1, и, следовательно, указатель будет указывать на ячейку памяти 1.
Указатели и строки C с примерами
Строка представляет собой массив объектов char, оканчивающийся нулевым символом ‘\0’. Мы можем манипулировать строками с помощью указателей. Этот указатель в примере C объясняет этот раздел
#include <stdio.h>
#include <string.h>
int main()
{
char str[]="Hello Guru99!";
char *p;
p=str;
printf("First character is:%c\n",*p);
p =p+1;
printf("Next character is:%c\n",*p);
printf("Printing all the characters in a string\n");
p=str; //reset the pointer
for(int i=0;i<strlen(str);i++)
{
printf("%c\n",*p);
p++;
}
return 0;
}
Вывод:
First character is:H Next character is:e Printing all the characters in a string H e l l o G u r u 9 9 !
Другой способ работы со строками — массив указателей, как в следующей программе:
#include <stdio.h>
int main(){
char *materials[ ] = { "iron", "copper", "gold"};
printf("Please remember these materials :\n");
int i ;
for (i = 0; i < 3; i++) {
printf("%s\n", materials[ i ]);}
return 0;}
Вывод:
Please remember these materials: iron copper gold
Преимущества указателей в C
- Указатели полезны для доступа к ячейкам памяти.
- Указатели обеспечивают эффективный способ доступа к элементам структуры массива.
- Указатели используются для динамического выделения и освобождения памяти.
- Указатели используются для формирования сложных структур данных, таких как связанный список, график, дерево и т. д.
Недостатки указателей в C
- Указатели немного сложны для понимания.
- Указатели могут привести к различным ошибкам, таким как ошибки сегментации, или могут получить доступ к ячейке памяти, которая вообще не требуется.
- Если указателю присваивается неверное значение, это может привести к повреждению памяти.
- Указатели также вызывают утечку памяти.
- Указатели работают сравнительно медленнее, чем переменные.
- Программистам очень сложно работать с указателями; поэтому ответственность за осторожное обращение с указателем лежит на программисте.
Обзор:
- Указатель — это не что иное, как область памяти, в которой хранятся данные.
- Для доступа к ячейке памяти используется указатель.
- Существуют различные типы указателей, например нулевой указатель, подстановочный указатель, недействительный указатель и другие типы указателей.
- Указатели можно использовать с массивами и строками для более эффективного доступа к элементам.
- Мы можем создавать указатели на функции для динамического вызова функции.
- С указателем можно выполнять арифметические операции, известные как арифметика указателя.
- Указатели также могут указывать на функцию, что упрощает вызов различных функций в случае определения массива указателей.
- Если вы хотите иметь дело с переменным типом данных, вы можете использовать указатель типа void.
Язык C
- Переменные C# и (примитивные) типы данных
- Типы пользовательских функций в программировании на C
- C указатели
- Указатели C++ с примерами
- Что такое 3D-печать? Принцип работы | Типы | Приложения
- Java — типы переменных
- C — указатели
- Типы переменных С++
- Python — типы переменных
- Что такое сварка? - Определение | Виды сварки