2014-01-31 42 views
48

我想知道常量指針VS指向不變

const int* ptr; 

int * const ptr; 

以及它是如何工作的區別。

我很難理解或記住這一點。 請幫忙。

+2

改變

int * const ptr;請閱讀第3章。在Peter C. Linden的Deep C Secrets一書的C中解讀聲明,您將學習如何使用指針,常量等的任意組合解密任何複雜的decalration。 – Deepthought

+4

8個答案?這是一個重複的很多努力。 – user694733

+0

愚蠢在這裏:http://stackoverflow.com/q/890535/694576不是它被關閉的地方,因爲後者是關於C++的。 – alk

回答

81
const int* ptr; 

聲明ptr一個指針const int類型。您可以自行修改ptr,但ptr指向的對象不得修改。

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

雖然

int * const ptr; 

聲明ptr一個const指針int類型。您不得修改ptr,但修改ptr指向的對象。

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

一般來說,我寧願這樣的,這使得它易於閱讀和理解的聲明(從右讀向左):

int const *ptr; // ptr is a pointer to constant int 
int *const ptr; // ptr is a constant pointer to int 
+0

在第二種情況下的常量指針不能在初始化後指向'NULL'嗎? –

+0

@Jayesh;不,你不能。 – haccks

+0

假設常量指針指向某個內存,並且我們正在釋放該內存。之後可以用NULL來分配嗎?如果沒有,那麼我認爲每個常量指針都是懸掛指針的權利? –

10
const int * ptr; 

意味着指向的數據是恆定不變的,但指針不是。

int * const ptr; 

意味着指示器是恆定的和不可改變的但尖的數據不是。

2

This Thread

Referncing恆指針

讓我們先了解一個常量指針是什麼。常量指針是一個指針,不能改變其持有的地址。換句話說,我們可以說,一旦一個常量指針指向一個變量,那麼它就不能指向任何其他變量。

恆定指針聲明如下:
<type of pointer> * const <name of pointer>
一個例子聲明將如下所示:
int * const ptr;
讓作爲小代碼來說明這些類型的指針:

#include<stdio.h> 

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

    return 0; 
} 

在上例:

  • 我們聲明兩個變量VAR1和VAR2
  • 一個常量指針「PTR」聲明並提出指向VAR1
  • 接下來,PTR由點VAR2。
  • 最後,我們嘗試打印指向ptr的值。

指向常量

從名稱可知,一個指針通過一個不能更改變量指向被稱爲一個指向常量的值。這些類型的指針可以改變它們指向的地址,但不能改變這些地址處保存的值。

一個指向常數定義爲: const <type of pointer>* <name of pointer> 定義的一個例子可以是: const int* ptr; 讓作爲小代碼來說明一個指針指向一個常數:

#include<stdio.h> 

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

    return 0; 
} 

在上面的代碼:

  • 我們定義的變量var1的值爲0
  • 我們定義d一個指向常量的指針指向變量var1
  • 現在,通過這個指針,我們試圖改變var1的值
  • 用printf打印新值。
+0

我genrally不做家庭工作...'url answers'不建議交友...下次發佈答案,而不是url ... + 1雖然! :) – NoobEditor

2
const int* ptr; 

是一個指向常數(內容)。您可以修改指針。例如ptr = NULL,ptr++,內容的修改是可能的。

int * const ptr; 

是一個常量指針。相反是可能的。你是不是允許修改指針,但你不允許修改它指向的內容,例如, *ptr += 5

2
int i; 
int j; 

int * const ptr1 = &i; 

編譯器會阻止您更改ptr1

const int * ptr2 = &i; 

編譯器將阻止您更改*ptr2

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

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

請注意,您仍然可以改變*ptr2,只是沒有通過逐字輸入*ptr2

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

你也可以有兩個特徵指針:

const int * const ptr3 = &i; 

ptr3 = &j; // error 
*ptr3 = 7; // error 
5

1)恆指針:這些類型的指針是不能改變他們指向地址之一。這意味着假設有一個指向變量的指針(或者存儲該變量的地址)。現在,如果我們試圖將指針指向其他一些變量(或者試圖使指針存儲其他變量的地址),那麼常量指針就無法實現這一點。

恆定指針被聲明爲:int *const ptr(位置「const的」使指針「PTR」作爲恆定指針)

2)指向常數:這些類型的指針是一個哪些不能改變它們指向的值。這意味着他們不能改變他們所持地址的變量的值。

指向一個常數被聲明爲:const int *ptr(的「常量」的位置,使指針「PTR」作爲指針以恆定

常量指針

#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; 
} 

現在,當我們編譯上面的代碼時,編譯器會抱怨:

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’ 

因此我們在上面看得很清楚,編譯器會抱怨我們不能更改常量指針所保存的地址。

指向常量

#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; 
} 

現在,當上面的代碼被編譯,編譯器會抱怨:

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’ 

因此這裏也我們看到,編譯器不允許指針不斷更改被指向的變量的值。

Quotation

+0

很好的解釋。 –

1

const int* ptr;想到這裏,如* PTR是恆定的,* PTR不能再同時認爲這裏就像PTR作爲一個常量,不能再改