常量指针与指向常量的指针[重复]

问题描述 投票:0回答:8

我想知道

之间的区别
const int* ptr;

int * const ptr; 

以及它是如何工作的。

我很难理解或记住这一点。 请帮忙。

c pointers constants
8个回答
470
投票
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

52
投票
const int * ptr;

表示指向的数据是常量且不可变的,但指针不是。

int * const ptr;

表示指针是常量且不可变的,但指向的数据却不是。


16
投票

1) 常量指针: 这些类型的指针不能更改其指向的地址。这意味着假设有一个指针指向一个变量(或存储该变量的地址)。现在,如果我们尝试将指针指向其他变量(或者尝试使指针存储其他变量的地址),则常量指针无法做到这一点。

常量指针声明为:

int *const ptr
('const'的位置使指针'ptr'成为常量指针)

2)指向常量的指针: 这些类型的指针不能更改其指向的值。这意味着他们无法更改其所持有地址的变量的值。

指向常量的指针声明为:

const int *ptr
(“const”的位置使指针“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’

因此在这里我们也看到编译器不允许指向常量的指针更改所指向变量的值。

报价


12
投票

参考资料 此主题

常量指针

我们先来了解一下什么是常量指针。常量指针是不能改变其所持有的地址的指针。换句话说,我们可以说,一旦常量指针指向一个变量,它就不能指向任何其他变量。

常量指针声明如下:

<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; // error: cannot assign to variable 'ptr' with const-qualified type 'int *const'
    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; // error: read-only variable is not assignable
    printf("%d\n", *ptr);

    return 0;
} 

在上面的代码中:

  • 我们定义了一个值为 0 的变量 var1
  • 我们定义了一个指向常量的指针,该常量指向变量 var1
  • 现在,通过这个指针我们尝试改变 var1 的值
  • 使用 printf 打印新值。

11
投票
const int* ptr;

是指向常量(内容)的指针。您可以修改指针。例如

ptr = NULL
ptr++
,但是内容的修改是不可能

int * const ptr;

是一个常量指针。相反的情况也是可能的。您被允许修改指针,但您被允许修改它所指向的内容,例如

*ptr += 5


7
投票
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

2
投票

请参考以下链接,以更好地了解常量值上的 Const 指针和 Pointer 之间的区别。

常量指针与常量值上的指针


2
投票

const int* ptr;
这里认为 *ptr 是常量,并且 *ptr 不能再次更改

int * const ptr;
虽然在这里将 ptr 视为一个常量,并且不能再次更改

© www.soinside.com 2019 - 2024. All rights reserved.