在C.声明int*p =&i;?

ass*_*gee 1 c

   int i = 10;
   int *p = &i;
   printf("%d\n", *p);
Run Code Online (Sandbox Code Playgroud)

打印出10.

但是,如果我写

  int i = 10;
  int *p;
  p = &i;
  printf("%d\n", *p);
Run Code Online (Sandbox Code Playgroud)

输出也是10.有什么区别吗?第二个实际上对我更有意义,因为它说p的值是i的地址,所以当取消引用p时,它得到i的值.所以我很困惑*p =&p在顶部做什么?

再举个例子,

int main() {
   int i = 10;
   func (&i);
   return 0;
}
void func (int * p) {
   *p = 15;
}
Run Code Online (Sandbox Code Playgroud)

当我被传递给func时,我可以将其视为*p =&i?由于C函数超过值?

Bru*_*uce 5

在第一种情况下,您创建p一个指针并i在单个操作(初始化)中为其分配地址.

在第二种情况下,您创建p一个指针(它指向随机存储器地址或NULL,具体取决于编译器和优化)然后在它应该指向的下一行上说i.

最终结果完全相同,编译器可能会优化到完全相同的代码中.

注意:注意明星意味着什么:int* p类似于int *p和指的p是"指向int"的类型.定义p后,*p取消引用指针.

  • 怀疑这可能被归类为更多语义:但是使用`int*p`,`p`的值是未定义的.它没有定义为指向内存的指针,也没有定义为"NULL",只是未定义.除了"NULL"等之外,它可能有一个陷阱值或与内存不对应的值. (2认同)