c中正常指针和const指针之间的区别

时间:2014-11-04 13:03:24

标签: c pointers

实际上我不知道普通指针和const指针之间有什么区别 如果我使用下面的代码它将工作正常。但是当我将int *ptr=#更改为int *const ptr = &var1;时,它将无效。谁能解释普通指针和常量指针之间有什么区别?

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

6 个答案:

答案 0 :(得分:5)

int* const ptr = &num ;

将创建一个指向int的常量指针。它指向的数据可以改变,但它自己的指针不能改变。

您无法更改指针:

ptr++ ;

但您可以更改数据:

*ptr = 1234 ;

答案 1 :(得分:3)

我们可以常量指针进行以下操作

  • 在地址
  • 处分配值
  • 打印价值或地址
  • 声明时指定地址。

我们无法常量指针进行以下操作

  • 将整数添加到常量指针。
  • 将整数减去常量指针。
  • 任何可以更改指针地址的操作。

所以,在你的问题中......

如果您声明

int* const ptr = &num ; // this is ok

下一行

*ptr = 20 ;  // Assigning value at address this is ok

现在,

ptr ++ ;  // you can not change the value // Error!

希望它有所帮助!

答案 2 :(得分:1)

此:

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指针很有用。

答案 3 :(得分:1)

在c中,consttype 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”。

你可以找到一个漂亮而方便的描述here

答案 4 :(得分:1)

int* const pointer = &x ;

它创建一个指向int的常量指针。它指向的数据可以改变,但它自己的指针不能改变

您无法更改指针:

pointer++ ;

在这里你可以改变数据:

*pointer=1 ;

答案 5 :(得分:0)


如果使用普通指针,则可以更改指针值 value @指针。但是,随着指针更改值@指针会自动更改为某些垃圾值。

#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指针,只能更改 value @指针。请参见下面的示例。

#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