Показивачи у програмирању на Ц: Шта је показивач, типови и ампер; Примери

Преглед садржаја:

Anonim

Шта је показивач у Ц?

Показивач у Ц, је променљива која складишти баве друге променљиве. Показивач се такође може користити за упућивање на другу функцију показивача. Показивач се може повећати / смањити, тј. Да укаже на следећу / претходну меморијску локацију. Сврха показивача је уштеда меморијског простора и постизање бржег времена извршавања.

Како се користе показивачи у Ц.

Ако прогласимо променљиву в типа инт, в ће заправо сачувати вредност.

в је сада једнако нули.

Међутим, свака променљива, осим вредности, има и своју адресу (или, једноставно речено, где се налази у меморији). Адреса се може добити стављањем знака & (&) испред имена променљиве.

Ако на екрану одштампате адресу променљиве, она ће изгледати као потпуно случајан број (штавише, може се разликовати од трчања до трчања).

Покушајмо ово у пракси са показивачем у Ц примеру

Резултат овог програма је -480613588.

Шта је показивач? Уместо да меморише вредност, показивач ће и меморисати адресу променљиве.

Променљива показивача

Инт * и = & в;

ПРОМЕНЉИВА

ПОИНТЕР

Вредност чувају у имену складиштења / меморијске адресе

Вариабле да указује на складиштење података / меморијску адресу другог променљиве

Изјава показивача

Као и променљиве, показивачи у програмирању на Ц морају се декларисати пре него што се могу користити у вашем програму. Показивачи могу да се именују како год желите уколико се придржавају правила именовања Ц. Декларација показивача има следећи облик.

data_type * pointer_variable_name;

Ево,

  • дата_типе је основни тип показивача типова променљивих Ц и означава тип променљиве на коју показивач показује.
  • Звездица (*: иста звездица која се користи за множење) која је индиректни оператор, декларише показивач.

Погледајмо неке важеће декларације показивача у овом водичу за Ц показиваче:

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 */

Иницијализујте показивач

Након декларације показивача, иницијализујемо га попут стандардних променљивих са променљивом адресом. Ако показивачи у програмирању на Ц нису неиницијализовани и не користе се у програму, резултати су непредвидљиви и потенцијално погубни.

Да бисмо добили адресу променљиве, користимо оператор амперсанд (&), постављен испред имена променљиве чија нам адреса треба. Иницијализација показивача врши се следећом синтаксом.

Синтакса показивача

 pointer = &variable; 

Једноставан програм за илустрацију показивача дат је у наставку:

#include int main(){int a=10; //variable declarationint *p; //pointer variable declarationp=&a; //store address of variable a in pointer pprintf("Address stored in a variable p is:%x\n",p); //accessing the addressprintf("Value stored in a variable p is:%d\n",*p); //accessing the valuereturn 0;}

Излаз:

Address stored in a variable p is:60ff08Value stored in a variable p is:10
Оператор Значење
* Служи у две сврхе
  1. Изјава показивача
  2. Враћа вредност референциране променљиве
& Служи само за једну намену
  • Враћа адресу променљиве

Врсте показивача у Ц.

Следе различите врсте показивача у Ц :

Нулл Поинтер

Нулти показивач можемо створити додељивањем нулл вредности током декларације показивача. Ова метода је корисна када показивачу није додељена ниједна адреса. Нулти показивач увек садржи вредност 0.

Следећи програм илуструје употребу нултог показивача:

#include int main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}

Излаз:

The value inside variable p is:0

Воид Поинтер

У програмирању на Ц, воид показивач се назива и генеричким показивачем. Нема ниједан стандардни тип података. Показивач на празнину креира се помоћу кључне речи воид. Може се користити за чување адресе било које променљиве.

Следећи програм илуструје употребу показивача празнине:

#include int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}

Излаз:

The size of pointer is:4

Дивљи показивач

Каже се да је показивач дивљи показивач ако се ничим не иницијализује. Ове врсте Ц показивача нису ефикасне јер могу указивати на неку непознату меморијску локацију која може проузроковати проблеме у нашем програму и може довести до пада програма. Увек треба бити опрезан док радите са дивљим показивачима.

Следећи програм илуструје употребу дивљег показивача:

#include int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}

Оутпут

timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main

Остале врсте показивача у 'ц' су следеће:

  • Висећи показивач
  • Сложени показивач
  • Близу показивача
  • Далеки показивач
  • Огроман показивач

Показивачи директног и индиректног приступа

У језику Ц постоје два еквивалентна начина за приступ променљивом садржају и управљање њиме

  • Директан приступ: користимо директно име променљиве
  • Индиректни приступ: користимо показивач на променљиву

Хајде да то схватимо уз помоћ програма испод

#include /* 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 = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48

Аритметика показивача у Ц.

Операције показивача су сажете на следећој слици

Операције показивача

Приоритетна операција (приоритет)

Када радимо са показивачима Ц, морамо поштовати следећа правила приоритета:

  • Оператори * и & имају исти приоритет као и унарни оператори (негација !, прираштај ++, декремент--).
  • У истом изразу, унарни оператори *, &,!, ++, - вреднују се здесна налево.

Ако показивач П показује на Кс променљиву, онда се * П може користити свуда где се Кс може написати.

Следећи изрази су еквивалентни:

инт Кс = 10 инт * П = & И; За горњи код, доњи изрази су тачни
Израз Еквивалентан израз
И = * П + 1 * П = * П + 10 * П + = 2 ++ * П (* П) ++ И = Кс + 1 Кс = Кс + 10 Кс + = 2 ++ Кс Кс ++

У потоњем случају су потребне заграде: пошто се унарни оператори * и ++ процењују здесна налево, без заграда би се повећавао показивач П, а не објекат на који указује П.

Испод табеле приказана је аритметичка и основна операција која се може користити у раду са показивачима Ц.

Операција Објашњење
Додељивање инт * П1, * П2 П1 = П2; П1 и П2 упућују на исту целобројну променљиву
Инкрементација и декрементација Инт * П1; П1 ++; П1--;
Додавање офсета (константно) Ово омогућава показивачу да премешта Н елемената у табели. Показивач ће се повећати или смањити за Н пута већи од броја бајтова типа променљиве. П1 + 5;

Ц Показивачи и низови са примерима

Традиционално елементима низа приступамо користећи његов индекс, али овај метод се може елиминисати употребом показивача. Показивачи олакшавају приступ сваком елементу низа.

#include int main(){int a[5]={1,2,3,4,5}; //array initializationint *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 elementsp++; //incrementing to the next element, you can also write p=p+1}return 0;}

Оутпут

12345

Додавањем одређеног броја показивачу помераће се место показивача на вредност добијену операцијом сабирања. Претпоставимо да је п показивач који тренутно показује на меморијску локацију 0 ако извршимо следећу операцију сабирања, п + 1, тада ће се извршити на овај начин:

Додавање / увећање показивача

Будући да п тренутно указује на локацију 0 након додавања 1, вредност ће постати 1, па ће стога показивач показати на меморијску локацију 1.

Ц Показивачи и жице са примерима

Низ је низ објеката са знаковима који се завршавају нулом знаком '\ 0'. Можемо манипулисати жицама помоћу показивача. Овај показивач у примеру Ц објашњава овај одељак

#include #include 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 pointerfor(int i=0;i

Оутпут

First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!

Други начин за бављење стринговима је низ низа показивача као у следећем програму:

#include 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:ironcoppergold

Предности показивача у Ц.

  • Показивачи су корисни за приступ меморијским локацијама.
  • Показивачи пружају ефикасан начин за приступ елементима структуре низа.
  • Показивачи се користе за динамичко додељивање меморије, као и за ослобађање.
  • Показивачи се користе за формирање сложених структура података као што су повезана листа, графикон, стабло итд.

Мане показивача у Ц.

  • Показивачи су мало сложени за разумевање.
  • Показивачи могу довести до различитих грешака попут грешака у сегментацији или могу приступити меморијској локацији која уопште није потребна.
  • Ако се показивачу прикаже нетачна вредност, то може проузроковати оштећење меморије.
  • Показивачи су такође одговорни за цурење меморије.
  • Показивачи су релативно спорији од оних променљивих.
  • Програмерима је веома тешко да раде са показивачима; стога је одговорност програмера да пажљиво манипулише показивачем.

Резиме

  • Показивач није ништа друго до меморијска локација на којој се чувају подаци.
  • Показивач се користи за приступ меморијској локацији.
  • Постоје разне врсте показивача као што су нулти показивач, дивљи показивач, поништавач и друге врсте показивача.
  • Показивачи се могу користити са низом и низом за ефикаснији приступ елементима.
  • Можемо створити показиваче на функције за динамичко позивање функције.
  • Аритметичке операције се могу изводити на показивачу који је познат под називом аритметика показивача.
  • Показивачи такође могу да покажу на функцију која олакшава позивање различитих функција у случају дефинисања низа показивача.
  • Када желите да обрађујете различите променљиве типа података, можете да користите типцаст воид поинтер.