簡體   English   中英

c中正常指針和const指針之間的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM