为什么声明void f(const int * p)正在修改p

时间:2013-07-15 00:22:03

标签: c pointers const

通过声明

const int i;

很明显i无法修改 那么为什么宣言

void f (const int *p) 

正在修改p? (我测试了它,它正在修改p但不知道怎么做?)。

3 个答案:

答案 0 :(得分:7)

const在指针声明中的位置很重要。你向后看了它:

  • const int *p表示“p是指向int的指针,它是常量”
  • int * const p表示“p是指向int”的常量指针
  • const int * const p表示“p是指向常量int”的常量指针

答案 1 :(得分:3)

由于const指向int p,而p指向int,指向const int *p

p

表示const int是指向p的指针,*p可以修改,int *const p 不是。

同样的方式

p

表示无法修改*p,而const int* p可以修改。

请注意,int const* pint const *p相同。

简单的规则是声明从右向左读取:int *const p表示“p是指向常量int的指针”,{{1}}表示“p是指向int的常量指针”。

(实际的完整规则更复杂,您可以使用http://cdecl.org/来“解码”C风格的声明。)

答案 2 :(得分:3)

因为在此表达式中,p是指向const int的指针。这意味着您可以更改p指向的内容。

这也意味着,“p”本身可以修改,但“p”的内容无法修改,因此*p = 10;将产生错误。

一个例子将清除事物:

#include <stdio.h>

void foo(const int *p)
{
  int x = 10;
  p = &x; //legally OK
  //  *p = 20; <- Results in an error, cannot assign to a read-only location. 
  printf("%d\n",*p);
}
int main(int argc, char *argv[])
{
  const int x10 = 100;
  foo(&x10);
  return 0;
}

使上述程序完全不修改指针:

#include <stdio.h>

void foo(const int *const p)
{
  int x = 10;
  p = &x; //legally NOT OK, ERROR!
  //  *p = 20; <- Results in an error, cannot assign to a read-only location. 
  printf("%d\n",*p);
}
int main(int argc, char *argv[])
{
  const int x10 = 100;
  foo(&x10);
  return 0;
}