C:指针=变量和指针=&变量之间有什么区别?

时间:2017-07-02 15:44:09

标签: c pointers

我正在阅读的教科书解释说,指针是保存另一个变量起始地址的变量,并且它们是用一种指向的数据类型定义的。为什么你可以指定一个指针作为变量的地址呢?如果省略“&”而不是地址如果这是指针的定义方式,它是否应该始终保持地址?

2 个答案:

答案 0 :(得分:0)

ptr是实际的指针,而*ptr是指向它的任何东西,所以*ptr=&var没有任何意义,除非它是指向指针的指针。它是ptr=&var*ptr=var

如果你真的想为指针赋一个变量,可以使用强制转换。编译,但我看不出有任何理由这样做:

#include <stdio.h>
main()
{
  int var=4;
  int *ptr;
  ptr = (int *)var;
  printf("%d\n", *ptr);
}

行为未定义。当我运行它时,它会发生分裂。

答案 1 :(得分:0)

C很久以前就已经设计好了,一些设计选择是在不再流行的情况下进行的。在函数原型是可选的并且模糊性不能从上下文中解析时,需要操作符的地址来将对象的地址而不是其值传递给函数。为了保持一致性,使用相同的语法进行赋值。

但请注意,您建议的语法简化无法再区分这些情况:

▶ python so_question.py a
user_var_value is: alfa

还有其他潜在的语法简化:

  • 对象和指针解除引用的@RestController@RequestMapping(value = "/selectUser", method = RequestMethod.GET, consumes = "application/json", produces="application/json") public ResponseEntity<User> getTravelByUserId(@RequestParam("userId") Long theId) { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); User userToReturn = new User(); return new ResponseEntity<User>(userToReturn, headers, HttpStatus.OK); } 运算符可以合并为一个运算符。

  • 间接函数调用的void *p; void *q = &p; // make q point to the pointer p void *q = p; // set q to the value of p 语法:.是reduncdant,因为->完全等效...(请注意,您也可以编写*