const 指针和指向 const 值的指针作为参数
const pointer and pointer to const value as parameter
我有一个像下面这样的程序,并期望:
with function void myFunc1 ( const int *x)
==> 我无法更改 x
指向的内存位置的值,但可以更改 [=12= 的内存位置] 指向.
with function void myFunc2 ( int const *x)
==> 我无法更改 x
指向的位置,因为它是一个 const 指针。但是我可以更改 x
指向的内存位置的值。
但是,在编译代码时,我看不出 const int *x
与 int const *x
之间的区别:
- 在两个函数中,
*x=8
行在两个函数return中出错。我没想到 myFunc2
会出错,因为它是 const
指针,而不是指向 const
值的指针。
- 在
myFunc1
中,我希望在 myFunc1
关闭后看到值 5。
这里的专家能解释一下我上面的两个意想不到的结果吗?这是我的代码:
#include "stdio.h"
int a = 5; // declared a global,
void myFunc1 ( const int *x) { // const parameter: pointer to a const int value.
// *x= 8; // error: assignment of read-only location ‘* x’ ==> cannot change the value at the location pointed by pointer. This is expected
printf("%d \n ", *x);
x = &a; // can change where the pointer point to.
// a is global and is not loss after closing myFunc2
printf("value in myFunc1: %d \n ", *x);
}
void myFunc2 ( int const *x) { // const parameter: const pointer, cannot change the address that x points to.
// *x= 8; // error: assignment of read-only location ‘* x’
printf("%d \n ", *x);
x = &a; // no compiling error here. This is not expected.
printf("value in myFunc2: %d \n ", *x);
}
int main() {
int *y;
int z = 6;
y = &z;
printf("value before myFunc1: %d \n", *y);
myFunc1(y);
printf("value after myFunc1: %d \n", *y); // expect to print 5. Result: print 6.
printf("value before myFunc2: %d \n", *y);
myFunc2(y);
printf("value after myFunc2: %d \n", *y); // expect to print 8 if the line *x=8 could be compiled . Result: print 6.
return 1;
}
I don't see the different between having 2 parameters (const int *x) vs (int const *x):
那是因为 int const*
和 const int*
是一回事。
如果你想让指针const
,你必须在它的右边放一个const
,像这样:int * const
,指向(非常量)int
eger.
的常量指针
东 const
上的不相关(是吗?)注释
我是支持所谓的东方const
的人之一,这意味着我更喜欢把const
写在什么的右边它适用于。例如,
- 对于“指向常量
int
的指针”,我写 int const *
、
- 对于“指向常量
int
的常量指针”,我写 int const * const
.
如您所见,如果您从右到左阅读,引号中的句子将映射到类型:
// 1 2 3 4 4 3 2 1
int const * const // constant pointer to constant int
此外,始终将 const
视为可以放在其适用对象的 右边 的东西还有其他优点,有时是根据您可以发现的语言。
例如,以下是我如何发现更多关于引用的信息。
取引用常量的函数参数声明:int const& p
。如果你这样写,并以 East const
的方式来思考它,很明显它声明了一个 p
,它是对常量 [= 的引用16=],不是对 int
.
的常量引用
毕竟,考虑 East const
,对 int
的常量引用会是什么样子?它将是 int & const
,const
位于我们希望应用的对象的右侧,引用 &
。但是,此语法不正确。
这是为什么?为什么我不能创建一个引用常量?因为它总是如此,因为引用无法重新绑定。该标准根本不允许您编写完全多余的内容作为 const
应用于参考。
我有一个像下面这样的程序,并期望:
with function
void myFunc1 ( const int *x)
==> 我无法更改x
指向的内存位置的值,但可以更改 [=12= 的内存位置] 指向.with function
void myFunc2 ( int const *x)
==> 我无法更改x
指向的位置,因为它是一个 const 指针。但是我可以更改x
指向的内存位置的值。
但是,在编译代码时,我看不出 const int *x
与 int const *x
之间的区别:
- 在两个函数中,
*x=8
行在两个函数return中出错。我没想到myFunc2
会出错,因为它是const
指针,而不是指向const
值的指针。 - 在
myFunc1
中,我希望在myFunc1
关闭后看到值 5。
这里的专家能解释一下我上面的两个意想不到的结果吗?这是我的代码:
#include "stdio.h"
int a = 5; // declared a global,
void myFunc1 ( const int *x) { // const parameter: pointer to a const int value.
// *x= 8; // error: assignment of read-only location ‘* x’ ==> cannot change the value at the location pointed by pointer. This is expected
printf("%d \n ", *x);
x = &a; // can change where the pointer point to.
// a is global and is not loss after closing myFunc2
printf("value in myFunc1: %d \n ", *x);
}
void myFunc2 ( int const *x) { // const parameter: const pointer, cannot change the address that x points to.
// *x= 8; // error: assignment of read-only location ‘* x’
printf("%d \n ", *x);
x = &a; // no compiling error here. This is not expected.
printf("value in myFunc2: %d \n ", *x);
}
int main() {
int *y;
int z = 6;
y = &z;
printf("value before myFunc1: %d \n", *y);
myFunc1(y);
printf("value after myFunc1: %d \n", *y); // expect to print 5. Result: print 6.
printf("value before myFunc2: %d \n", *y);
myFunc2(y);
printf("value after myFunc2: %d \n", *y); // expect to print 8 if the line *x=8 could be compiled . Result: print 6.
return 1;
}
I don't see the different between having 2 parameters (const int *x) vs (int const *x):
那是因为 int const*
和 const int*
是一回事。
如果你想让指针const
,你必须在它的右边放一个const
,像这样:int * const
,指向(非常量)int
eger.
东 const
上的不相关(是吗?)注释
我是支持所谓的东方const
的人之一,这意味着我更喜欢把const
写在什么的右边它适用于。例如,
- 对于“指向常量
int
的指针”,我写int const *
、 - 对于“指向常量
int
的常量指针”,我写int const * const
.
如您所见,如果您从右到左阅读,引号中的句子将映射到类型:
// 1 2 3 4 4 3 2 1
int const * const // constant pointer to constant int
此外,始终将 const
视为可以放在其适用对象的 右边 的东西还有其他优点,有时是根据您可以发现的语言。
例如,以下是我如何发现更多关于引用的信息。
取引用常量的函数参数声明:int const& p
。如果你这样写,并以 East const
的方式来思考它,很明显它声明了一个 p
,它是对常量 [= 的引用16=],不是对 int
.
毕竟,考虑 East const
,对 int
的常量引用会是什么样子?它将是 int & const
,const
位于我们希望应用的对象的右侧,引用 &
。但是,此语法不正确。
这是为什么?为什么我不能创建一个引用常量?因为它总是如此,因为引用无法重新绑定。该标准根本不允许您编写完全多余的内容作为 const
应用于参考。