回答
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
在第二種情況下的常量指針不能在初始化後指向'NULL'嗎? –
@Jayesh;不,你不能。 – haccks
假設常量指針指向某個內存,並且我們正在釋放該內存。之後可以用NULL來分配嗎?如果沒有,那麼我認爲每個常量指針都是懸掛指針的權利? –
const int * ptr;
意味着指向的數據是恆定不變的,但指針不是。
int * const ptr;
意味着指示器是恆定的和不可改變的但尖的數據不是。
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打印新值。
我genrally不做家庭工作...'url answers'不建議交友...下次發佈答案,而不是url ... + 1雖然! :) – NoobEditor
const int* ptr;
是一個指向常數(內容)。您可以修改指針。例如ptr = NULL
,ptr++
,內容的修改是可能的。
int * const ptr;
是一個常量指針。相反是可能的。你是不是允許修改指針,但你不允許修改它指向的內容,例如, *ptr += 5
。
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
請參考以下鏈接,以便更好地瞭解Const指針和指針之間恆定值的區別。
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’
因此這裏也我們看到,編譯器不允許指針不斷更改被指向的變量的值。
很好的解釋。 –
const int* ptr;
想到這裏,如* PTR是恆定的,* PTR不能再同時認爲這裏就像PTR作爲一個常量,不能再改
- 1. 常量指針vs常量值指針
- 2. 常量指針VS常變量
- 3. 指向常量常量的空指針
- 4. 指向變量的指針
- 5. ROM變量指針指向RAM變量?
- 6. 指針VS變量,Objective-C
- 7. 指向矢量的指針不指向
- 8. C指針,指向全局變量:不同的指針
- 9. 爲什麼將「指針指向非常量」轉換爲「指向常量指針的指針」
- 10. 指向矢量指針Vs的指針迭代器
- 11. 是一個常量字符指針,指向一個常量字符或指向字符的常量指針嗎?
- 12. 指向常量字符的指針
- 13. C++類型鑄造指向常量變量的指針
- 14. 變量向量的指針向量
- 15. 變量空指針異常
- 16. 指向JavaScript中變量的指針
- 17. 如何指向指針變量
- 18. 通過指針指向結構指針來更改變量
- 19. 指向矢量的指針
- 20. 保持常量的指針向量
- 21. 將指向結構成員變量的(常規)指針轉換爲指向整個結構的指針
- 22. 指針變量
- 23. 指針vs指針指針C
- 24. 局部變量vs指針的性能
- 25. sscanf指針vs變量地址
- 26. 瞭解指針常量指針到整型常量(const int的* const的*變量)
- 27. 更改常量變量的指針C++
- 28. 常量指針修復一個變量
- 29. 迭代指針向量指針
- 30. 是否有可能有一個指針指向第一個指針所指向的變量的指針?
改變
int * const ptr;
請閱讀第3章。在Peter C. Linden的Deep C Secrets一書的C中解讀聲明,您將學習如何使用指針,常量等的任意組合解密任何複雜的decalration。 – Deepthought8個答案?這是一個重複的很多努力。 – user694733
愚蠢在這裏:http://stackoverflow.com/q/890535/694576不是它被關閉的地方,因爲後者是關於C++的。 – alk