如何为const结构指针的变量赋值?

时间:2015-06-29 06:59:08

标签: c pointers structure constants

在下面的代码中,我无法单独更改x和y的值。有人可以帮我分别分配这些值吗?

DECLARE @tblRangeIP TABLE(Digit1 INT,Digit2 INT,Digit3 INT,Digit4 INT)

SELECT * FROM dbo.f_Eng_Str_SplitOneDim('66.249.64.236','.')

select Digit1,  Digit2,  Digit3,  Digit4
from 
(
  SELECT Value FROM dbo.f_Eng_Str_SplitOneDim('66.249.64.236','.')
) d
pivot
(
  max(value)
  for d.Value in ( Digit1,  Digit2,  Digit3,  Digit4 )
) piv;

注意:我搜索过这样一个例子,我无法找到,而且我的时间已经不多了。如果问题已经提出,我真的很抱歉浪费你的时间,请为我提供链接以供参考。

3 个答案:

答案 0 :(得分:3)

有两个重要问题需要考虑:

  1. const struct p*是"指向const p"的指针,这意味着您无法修改它指向的实例。它可以指向非const对象,但您无法使用指针修改所述对象。

  2. 指针必须指向有效对象才能取消引用。

  3. 您需要创建一个有效的p实例,然后使指针指向它:

    struct p x = {p2, p3};
    const struct p *ptr1 = &x;
    

    在此示例中,在自动存储中创建p实例。如果更适合您的需要,您还可以使用malloc动态实例化一个。例如,

    struct p *px = malloc(sizeof (struct p));
    px->x = p2;
    px->y = p3;
    const struct p *ptr1 = px;
    

    在这两个示例中,您可以分别通过ptr1x修改实例px,但不能通过ptr1修改。

答案 1 :(得分:3)

const struct p *ptr1 = {&p2,&p3}; //  --- giving the expected result

它编译,但有这个警告;无论如何,它可能不会做你想要的事情:

  

警告:不兼容的指针类型使用'int *'类型的表达式初始化'const struct p *'[-Wincompatible-pointer-types]

要创建一个指向struct的常量指针,可以使用:

const struct p *ptr1 = &(struct p){p2, p3};

关于lifetime的快速说明:

  

如果复合文字出现在函数体外,则该对象具有静态存储持续时间;否则,它具有与封闭块相关的自动存储持续时间。

答案 2 :(得分:3)

由于作者似乎想要更改她声明const的结构,这实际上可能是一个非常相关的答案。

与这个问题直接相关的常见问题是

const struct p *ptr1

是指向“const struct p”的指针,这意味着指针变量ptr1可以更改并稍后指向不同的struct p,但无论它指向何处,都无法使用该指针写入结构的成员指针(例如ptr1->x = blah;)。

有些人可能正在寻找的是一个指针,它是const,因此在初始化后被指定为一个内存时,它不能指向不同的内存。

那将是

struct p * const ptr2 = ptr1   // whatever ptr1 currently points to, ptr2 will point to there, from now to forever (for the lifetime / scope of ptr2).