任何人都可以向我解释以下两个代码块之间的区别:
func1 (...)
{
int32_t index;
const int32_t *p;
p =& (index);
}
func2 (...)
{
const int32_t s;
s=10;
}
可以声明一个const指针,然后为其分配一个值,但无法声明一个普通变量,然后为其分配一个值。有人可以向我解释吗?
我收到一个pc-lint错误,我必须在函数内部声明const变量,但我不能这样做。如何摆脱这个错误?
非常感谢您。
答案 0 :(得分:2)
这是因为他们不是做同样的事情(因为我基本上是懒惰的,所以使用T
作为类型):
const T *p; // non-const pointer to const T.
const T s; // const T.
可能有助于将前者像[const T] [*p]
那样具有约束力。
如果要使用const
指针,请使用以下任一方法进行操作:
T * const p; // const pointer to non-const T, [T*] [const p]
const T * const p; // const pointer to const T, [const T*] [const p].
答案 1 :(得分:1)
SqlManagementClient client = new SqlManagementClient()
{ SubscriptionId = "f8432491-988a-4611-9a2c-f799bdfac722" }
);
Database currentDatabase = client.Databases.Get("trialresourcegroup-name", "serverservername", "Database1");
Database dbInstance = new Database();
dbInstance.Location = currentDatabase.Location;
dbInstance.CreateMode = "Basic";
dbInstance.ElasticPoolId = currentDatabase.ElasticPoolId;
dbInstance.MaxSizeBytes = currentDatabase.MaxSizeBytes;
dbInstance.Collation = currentDatabase.Collation;
// Create a SQL Database management client
var poolDbResponse = client.Databases.CreateOrUpdate("trialresourcegroup", "saas-trial-server.database.windows.net", "Database2", dbInstance);
这是int i=0;
const int *p=&i;
*p = 10; /*error*/
,因为p被声明为incorrect
,所以您不能通过p更改p指向的整数值。
pointer to constant int
这是int i=0;
int const *p=&i;
*p = 10; /* i will be 10 */
,因为p被声明为correct
,所以您可以通过p更改p指向的整数值。
constant pointer to int
这是int i=0;
const int const *p;
p = &i; /*error*/
*p = 10; /*error*/
,因为p被声明为incorrect
,所以您既不能通过p指向p指向的整数值,也不能更改在声明p之后的值。
答案 2 :(得分:0)
“可以声明一个
const
指针,然后为其分配一个值...”
const int32_t *p
不是指向const
的{{1}}指针。它是指向int32_t
const
的非const
指针。
int32_t
将为您提供指向int32_t * const p;
的{{1}}指针。请注意const
声明符位于int32_t
声明符的右侧。
您可以根据需要修改指针本身,因为它不是const
,所以*
很好。请注意,括号是多余的。
“ ...但是无法声明普通变量,然后为其分配值。”
const
不是“常规可修改”变量。用p = &(index);
声明。定义/初始化后,您无法分配const int32_t s;
变量。您只能在定义时对其进行一次初始化。
因此,使用
const
当然会给您一个错误。
如何摆脱这个错误?
初始化const
定义:
const int32_t s;
s = 10;