[英]what is difference between normal pointer & self referential pointer in c language
[英]Difference between normal pointer and const pointer in c
我不知道普通指針和const
指針之間的區別。 下面的代碼工作正常,但是當我改變int *ptr=#
to int *const ptr = &var1;
然后它沒有。 普通指針和const
指針有什么區別?
int main(void)
{
int num = 20;
int *ptr = &num ; // if i change to `int *const ptr = &var1;` then it shows some error
*ptr = 20 ; // Valid
ptr ++ ; // valid
return 0;
}
int* const ptr = &num ;
將創建一個指向int的常量指針。 它指向的數據可以改變,但它自己的指針不能改變。
你不能改變指針:
ptr++ ;
但是你可以改變數據:
*ptr = 1234 ;
我們可以對常量指針進行以下操作
我們不能對常量指針進行操作
所以,在你的問題中..
如果你宣布
int* const ptr = &num ; // this is ok
下一行
*ptr = 20 ; // Assigning value at address this is ok
現在,
ptr ++ ; // you can not change the value // Error!
希望能幫助到你!
這個:
int* const ptr = &num ;
將創建一個指向整數的常量指針 。 您可以使用它來修改整數的值,但不能更改指針指向的位置,因此ptr++ ;
是無效的。
const
關鍵字通常應用於其左符號,例如
int * const ptr; // A constant pointer (*)
int const * ptr; // A pointer to a constant integer
int const * const ptr; // A constant pointer to a constant integer
const int *ptr; // Shorthand for pointer to a constant integer (equivalent to int const * ptr;)
當您想要傳遞固定的內存位置時, const
指針很有用,並且您希望確保沒有人會修改指針的指向地址。
在c中, const
是一個type qualifier
。 在某些變量定義中使用const
意味着,在程序的整個生命周期內,變量不會被修改(將被視為read-only
)。
通常,在使用const
定義變量/數據類型時,實踐是使用所需的值對其進行初始化,因為通常,它保留的值不能在以后的部分進行修改。
例如:
const int a = 10;
意味着,整數a
將保持值10
並且不能更改。 在后來的部分,
a = 20;
會產生錯誤。
所以,在你的情況下
int *const ptr = &var;
在這里, ptr
將始終保存var
的地址,並且無法更改,即我們無法寫入
ptr = &num2; // where num2 is another int, declared like int num2;
它會顯示編譯時錯誤,如:
錯誤:分配只讀變量“* ptr”。
你可以在這里找到一個漂亮而方便的描述。
int* const pointer = &x ;
它創建一個指向int的常量指針。 它指向的數據可以更改,但它自己的指針不能更改
你不能改變指針:
pointer++ ;
在這里你可以改變數據:
*pointer=1 ;
在普通指針的情況下, 指針和值@指針的值都可以改變。但是當指針改變時, @指針值會自動變為某個垃圾值。
#include <stdio.h>
int main () {
int val = 5;
int *ptr = (int*)&val;
printf("val@ptr : %d \nptr : %x\n", *(ptr), (int*)ptr);
val++;
printf("\nIncrement val++\n");
printf("val@ptr : %d \nptr : %x\n", *(ptr), (int*)ptr);
ptr++;
printf("\nIncrement ptr++\n");
printf("val@ptr : %d \nptr : %x\n", *(ptr), (int*)ptr);
return 0;
}
輸出:
val@ptr : 5
ptr : 93ddc274
Increment val++
val@ptr : 6
ptr : 93ddc274
Increment ptr++
val@ptr : -1814183304
ptr : 93ddc278
但是在const指針的情況下,只有值@ pointer可以改變而不是指針。 請參閱以下示例。
#include <stdio.h>
int main () {
int val = 10;
//always start reading from right to left
int *const ptr = (int*)&val;//ptr is const pointer to int, i.e. ptr can not be change at all.
printf("The value1 @ptr : %d\t and ptr val : %x\n", *(ptr), (int*)ptr);
val++;
//ptr++;
printf("The value1 @ptr : %d\t and ptr val : %x\n", *(ptr), (int*)ptr);
return 0;
}
輸出:
The value1 @ptr : 10 and ptr val : ee2ccf24
The value1 @ptr : 11 and ptr val : ee2ccf24
如果我們取消注釋第11行,那么輸出將是這樣的:
main.c:11:7: error: increment of read-only variable ‘ptr’
ptr++;
請仔細閱讀鏈接以獲得更好的理解: http : //c-faq.com/decl/spiral.anderson.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.