gpt4 book ai didi

c - var 和 &(*var) 有什么区别

转载 作者:太空狗 更新时间:2023-10-29 17:00:15 27 4
gpt4 key购买 nike

一些源代码使用符号 &(*var) 其中 var 已经是一个指针,比如 int *var = ... .

这两种表示法有区别吗?

var != &(*var) 吗?

示例:https://github.com/FreeFem/FreeFem-sources/blob/develop/src/medit/inout_popenbinaire.c#L40

最佳答案

&(*var) 在大多数情况下,在编译时的计算结果与 var 相同,但请注意一些注意事项:

  • var 应该是一个有效的指针,尽管编译器没有理由生成代码来取消引用它。事实上,C11 规定即使 var 是空指针,&*var 也没有未定义的行为。
  • 正如 Pascal Cuoq 评论的那样,var 不应是指向 void 的指针,但 C 标准明确允许在这种情况下使用它。 .. 确实令人震惊。
  • 如果 var 是一个数组,有多个元素,var&*var 有不同的类型和 sizeof (var)sizeof(&(*var)) 有不同的值:第一个是数组的大小,而第二个是指向其第一个元素的指针的大小.
  • 正如 Peter 评论的那样,如果 var 是一个未初始化的指针,那么评估 var == &(*var) 会给出未定义的行为(因为评估 == 的任一侧都会产生未定义的行为 - 访问未初始化变量的值会产生未定义的行为)。

您在问题中链接到的示例没有任何目的使用此结构:

#define WrdSiz 4

void getline_bin_float_vertex(int ddim, double *c, int *ref) {
int i;
float ff;

for (i = 0; i < ddim; i++) {
fread((unsigned char *)&(ff), WrdSiz, 1, stdin);
c[i] = ff;
}
fread((unsigned char *)&(*ref), WrdSiz, 1, stdin);
}

程序员正在从重定向到标准输入的文件中读取一些浮点值和一个整数。代码笨拙且不可移植:

  • float 的大小默认为 4
  • int 的大小默认为相同的 4 个字节
  • c 必须是有效指针,除非 ddim 为 0
  • ref 必须是一个有效的指针,因为 fread 将尝试在它指向的地址存储 4 个字节,除非流位于文件末尾
  • 文件结尾和读取错误被静默忽略,并且可能出现未定义的行为。

可以这样简化和保护代码:

#define WrdSiz 4

/* read values from stdin, return non-zero in case of failure */
int getline_bin_float_vertex(int ddim, double *c, int *ref) {
int i;
float ff;

assert(sizeof float == WrdSiz);
assert(sizeof int == WrdSiz);
assert(dim == 0 || c != NULL);
assert(ref != NULL);

for (i = 0; i < ddim; i++) {
if (fread(&ff, sizeof ff, 1, stdin) != 1)
return -1;
c[i] = ff;
}

if (fread(ref, sizeof(*ref), 1, stdin) != 1)
return -1;
return 0;
}

此源代码的其他部分显示了不良甚至无效的结构,您应该仅研究此包以了解不应该做的事情。

关于c - var 和 &(*var) 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50422782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com