const指针的声明与const整数的声明

时间:2020-08-29 08:01:55

标签: c variables memory constants pc-lint

任何人都可以向我解释以下两个代码块之间的区别:

func1 (...)
{
    int32_t index;
    const int32_t *p;
    p =& (index);
}
func2 (...)
{
     const int32_t s;
     s=10;  
}

可以声明一个const指针,然后为其分配一个值,但无法声明一个普通变量,然后为其分配一个值。有人可以向我解释吗?

我收到一个pc-lint错误,我必须在函数内部声明const变量,但我不能这样做。如何摆脱这个错误?

非常感谢您。

3 个答案:

答案 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;