关于C#:常量指针vs指向常量的指针

Constant pointer vs Pointer to constant

本问题已经有最佳答案,请猛点这里访问。

我想知道

1
const int* ptr;

1
int * const ptr;

以及它的工作原理。

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


1
const int* ptr;

A说ptrconst int两个指针的类型。你可以修改它,但ptr芒两市ptr对象将不会是修饰。

1
2
3
4
const int a = 10;
const int* ptr = &a;  
*ptr = 5; // wrong
ptr++;    // right

1
int * const ptr;

A说ptrconstint两个指针的类型。你是不允许修改ptr两个对象,但两市ptr芒。

1
2
3
4
int a = 10;
int *const ptr = &a;  
*ptr = 5; // right
ptr++;    // wrong

一般会prefer这样的声明,这使它容易读和理解(读从两个左右):

1
2
int const  *ptr; // ptr is a pointer to constant int
int *const ptr;  // ptr is a constant pointer to int


1
const int * ptr;

数据的均值,芒等immutable冰和冰槽,但指针。

1
int * const ptr;

均值,指针和冰等数据,但immutable芒冰槽。


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

常量指针声明为:int *const ptr(const的位置使指针"ptr"成为常量指针)

2)指向常量的指针:这些指针类型不能更改它们指向的值。这意味着它们不能更改所保存地址的变量的值。

指向常量的指针声明为:const int *ptr(const的位置使指针"ptr"成为指向常量的指针。

例子

常量指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>

int main(void)
{
    int a[] = {10,11};
    int* const ptr = a;

    *ptr = 11;

    printf("
 value at ptr is  : [%d]
"
,*ptr);
    printf("
 Address pointed by ptr  : [%p]
"
,(unsigned int*)ptr);

    ptr++;
    printf("
 Address pointed by ptr  : [%p]
"
,(unsigned int*)ptr);

    return 0;
}

现在,当我们编译上述代码时,编译器会抱怨:

1
2
3
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’

因此,我们在上面非常清楚地看到,编译器抱怨我们不能更改常量指针持有的地址。

指向常量的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>

int main(void)
{
    int a = 10;
    const int* ptr = &a;


    printf("
 value at ptr is  : [%d]
"
,*ptr);
    printf("
 Address pointed by ptr  : [%p]
"
,(unsigned int*)ptr);

    *ptr = 11;

    return 0;
}

现在,当编译上述代码时,编译器会抱怨:

1
2
3
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’

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

报价


从referncing this线程

变分

让我们先明白什么是指针,冰淇淋等。A值是一个指针,指针的地址,不能改变它的股份。在其他的话,我们可以说,"一点两个指针的值是不能变点的两个网络的任何其他变量。

A为常数指针冰follows宣布:
* const
以声明方式将看起来像:
int * const ptr;
让我们采取一个小码的两个illustrate这些类型的指针:

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>

int main(void)
{
    int var1 = 0, var2 = 0;
    int *const ptr = &var1;
    ptr = &var2;
    printf("%d
"
, *ptr);

    return 0;
}

在以上的实例:

  • 我们宣布的双变量和变量2 1 >
  • A值的指针ptr是宣布与制造两个点1 >
  • next ptr指针变量2两个冰淇淋制造。
  • 终于,我们试图打印的PTR值两个冰指指点点。

两个指针的值

名为"明显的"一通,指针不能变一变它的价值作为一个已知点冰的两个值的指针。这些类型的指针可以改变他们的地址,但不能两个相变点的值来把这些地址。

一个指针的值定义为:冰 const * 西安example of -可以定义: const int* ptr; 让我们采取一个小代码illustrate A两个指针:一个常数

1
2
3
4
5
6
7
8
9
10
11
12
 #include<stdio.h>

int main(void)
{
    int var1 = 0;
    const int* ptr = &var1;
    *ptr = 1;
    printf("%d
"
, *ptr);

    return 0;
}

在上面的代码:

  • 我们定义一个变量的值0和1
  • 我们定义一个指针,两个固定点的两个变量1
  • 现在,我们想通过这个指针的值的两个转变:1
  • 使用printf打印两个新的价值。


1
const int* ptr;

两个指针是一个常数(内容)。你是允许修改这两个指针。例如ptr = NULLptr++,修改的内容是不可能的。

1
int * const ptr;

指针是一个常数。在对面的是可能的。你是不允许修改的两个指针,但你有两个,它允许修改,例如*ptr += 5分。


1
2
3
4
int i;
int j;

int * const ptr1 = &i;

停止你的编译器会改变ptr1

1
const int * ptr2 = &i;

停止你的编译器会改变*ptr2

1
2
3
4
5
ptr1 = &j; // error
*ptr1 = 7; // ok

ptr2 = &j; // ok
*ptr2 = 7; // error

注意你可以改变*ptr2静止,不只是城市literally typlng *ptr2

1
2
3
4
5
6
7
i = 4;
printf("before: %d
"
, *ptr2); // prints 4
i = 5;
printf("after: %d
"
, *ptr2); // prints 5
*ptr2 = 6; // still an error

你可以用一个指针也有两个特点:

1
2
3
4
const int * const ptr3 = &i;

ptr3 = &j; // error
*ptr3 = 7; // error


const int* ptr;这里认为*ptr是常数,而*ptr不能再改变。

int * const ptr;虽然这里把ptr看作一个常数,但不能再改变了。


请参考下面的链接(更好的理解之间的差异教育的指针和指针在一个恒定值。

指针与指针的值是一个定值