Stały wskaźnik vs wskaźnik do stałej [duplikat]

To pytanie ma już odpowiedź tutaj:

Chcę poznaj różnicę między

const int* ptr;

I

int * const ptr; 
I jak to działa. Trudno mi to zrozumieć i zapamiętać. Proszę o pomoc.
Author: haccks, 2014-01-31

8 answers

const int* ptr; 

Deklaruje ptr Wskaźnik do const int typu. Można modyfikować ptr, ale obiekt wskazywany przez ptr nie może być modyfikowany.

const int a = 10;
const int* ptr = &a;  
*ptr = 5; // wrong
ptr++;    // right  

While

int * const ptr;  

Deklaruje ptr a const Wskaźnik do typu int. Nie wolno modyfikować ptr, ale obiektu wskazywanego przez ptr.

int a = 10;
int *const ptr = &a;  
*ptr = 5; // right
ptr++;    // wrong

Ogólnie wolałbym taką deklarację, która ułatwia czytanie i zrozumienie (czytane od prawej do lewej):

int const  *ptr; // ptr is a pointer to constant int 
int *const ptr;  // ptr is a constant pointer to int
 120
Author: haccks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-03 07:46:39
const int * ptr;

Oznacza, że dane wskazujące są stałe i niezmienne, ale wskaźnik nie jest.

int * const ptr;

Oznacza, że wskaźnik jest stały i niezmienny, ale dane wskazywane nie są.

 14
Author: Itachi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 09:49:39

1) stałe wskaźniki: tego typu wskaźniki nie mogą zmienić adresu, na który wskazują. Oznacza to, że Załóżmy, że istnieje wskaźnik, który wskazuje na zmienną (lub przechowuje adres tej zmiennej). Teraz, jeśli spróbujemy skierować wskaźnik na inną zmienną (lub postaramy się, aby wskaźnik przechowywał adres innej zmiennej), wtedy stałe wskaźniki nie są do tego zdolne.

Stały wskaźnik jest zadeklarowany jako: int *const ptr (położenie 'const' sprawia, że pointer ' ptr ' jako stały wskaźnik)

2) Wskaźnik do stałej: tego typu wskaźniki nie mogą zmienić wartości, na którą wskazują. Oznacza to, że nie mogą zmienić wartości zmiennej, której adres przechowują.

Wskaźnik do stałej jest zadeklarowany jako: const int *ptr (położenie ' const 'sprawia, że wskaźnik' ptr ' jest wskaźnikiem do stałej.

Przykład

Wskaźnik Stały

#include<stdio.h>

int main(void)
{
    int a[] = {10,11};
    int* const ptr = a;

    *ptr = 11;

    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    ptr++;
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    return 0;
}

Teraz, kiedy kompilujemy powyższy kod, kompilator narzeka:

practice # gcc -Wall constant_pointer.c -o constant_pointer
constant_pointer.c: In function ‘main’:
constant_pointer.c:13: error: increment of read-only variable ‘ptr’

Stąd widzimy bardzo wyraźnie powyżej, że kompilator skarży się, że nie możemy zmienić adresu posiadanego przez stały wskaźnik.

Wskaźnik do stałych

#include<stdio.h>

int main(void)
{
    int a = 10;
    const int* ptr = &a;


    printf("\n value at ptr is  : [%d]\n",*ptr);
    printf("\n Address pointed by ptr  : [%p]\n",(unsigned int*)ptr);

    *ptr = 11;

    return 0;
}

Teraz, gdy powyższy kod jest kompilowany, kompilator narzeka:

practice # gcc -Wall pointer_to_constant.c -o pointer_to_constant
pointer_to_constant.c: In function ‘main’:
pointer_to_constant.c:12: error: assignment of read-only location ‘*ptr’

Stąd też tutaj widzimy, że kompilator nie pozwala wskaźnikowi na stałą, aby zmienić wartość wskazywanej zmiennej.

Notowanie

 7
Author: MustafaP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 09:58:08

[[6]] odsyłacz od Ten Wątek

Stałe Wskaźniki

Pozwala najpierw zrozumieć, co to jest stały wskaźnik. Stały wskaźnik jest wskaźnikiem, który nie może zmienić adresu, którego trzyma. Innymi słowy, możemy powiedzieć, że gdy stały wskaźnik wskazuje na zmienną, to nie może wskazywać na żadną inną zmienną.

Wskaźnik stały deklarowany jest w następujący sposób :
<type of pointer> * const <name of pointer>
Przykładowa deklaracja wyglądałaby następująco :
int * const ptr;
Weźmy mały kod, aby zilustrować tego typu wskaźniki:

#include<stdio.h>

int main(void)
{
    int var1 = 0, var2 = 0;
    int *const ptr = &var1;
    ptr = &var2;
    printf("%d\n", *ptr);

    return 0;
} 

W powyższym przykładzie:

  • zadeklarowaliśmy dwie zmienne var1 i var2
  • stały wskaźnik " ptr " został zadeklarowany i wykonany do punktu var1
  • następnie, ptr przechodzi do punktu var2.
  • na koniec staramy się wydrukować wartość, na którą wskazuje ptr.

Wskaźnik do stałej

Jak wynika z nazwy, a wskaźnik, za pomocą którego nie można zmienić wartości zmiennej, którą wskazuje, jest znany jako wskaźnik na stałą. Tego typu wskaźniki mogą zmieniać adres, na który wskazują, ale nie mogą zmieniać wartości przechowywanej pod tym adresem.

Wskaźnik do stałej jest zdefiniowany jako : const <type of pointer>* <name of pointer> Przykładem definicji może być : const int* ptr; Weźmy mały kod, aby zilustrować wskaźnik do stałej:

 #include<stdio.h>

int main(void)
{
    int var1 = 0;
    const int* ptr = &var1;
    *ptr = 1;
    printf("%d\n", *ptr);

    return 0;
} 

W powyższym kodzie :

  • zdefiniowaliśmy zmienną var1 o wartości 0
  • we zdefiniowano wskaźnik do stałej, która wskazuje na zmienną var1
  • teraz, za pomocą tego wskaźnika próbowaliśmy zmienić wartość var1
  • użyto printf do wydrukowania nowej wartości.
 3
Author: G one,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 10:56:07
const int* ptr;

Jest wskaźnikiem do stałej (content). Możesz modyfikować wskaźnik. np. ptr = NULL, ptr++, ale modyfikacja treści jest nie możliwa.

int * const ptr;

Jest stałym wskaźnikiem. Odwrotnie jest możliwe. Możesz Nie modyfikować wskaźnik, ale możesz modyfikować to, do czego wskazuje np. *ptr += 5.

 3
Author: Sergey L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 14:16:35
int i;
int j;

int * const ptr1 = &i;

Kompilator powstrzyma cię od zmiany ptr1.

const int * ptr2 = &i;

Kompilator powstrzyma cię od zmiany *ptr2.

ptr1 = &j; // error
*ptr1 = 7; // ok

ptr2 = &j; // ok
*ptr2 = 7; // error

Zauważ, że nadal możesz zmienić *ptr2, po prostu nie wpisując dosłownie *ptr2:

i = 4;
printf("before: %d\n", *ptr2); // prints 4
i = 5;
printf("after: %d\n", *ptr2); // prints 5
*ptr2 = 6; // still an error

Możesz również mieć wskaźnik o obu cechach:

const int * const ptr3 = &i;

ptr3 = &j; // error
*ptr3 = 7; // error
 2
Author: immibis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 09:51:16

Proszę zapoznać się z poniższym linkiem, aby lepiej zrozumieć różnicę między wskaźnikiem Const a Wskaźnikiem na stałej wartości.

Wskaźnik stały vs wskaźnik na stałej wartości

 1
Author: SridharKritha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:56

const int* ptr; tutaj myśl, że * ptr jest stałe i * ptr nie może być ponownie zmienione

int * const ptr; podczas gdy tutaj pomyśl jak ptr jako stała i nie można tego ponownie zmienić

 1
Author: user2760375,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 09:58:51