gpt4 book ai didi

c - C 中的指针赋值、地址运算符和解引用指针

转载 作者:行者123 更新时间:2023-11-30 20:12:51 24 4
gpt4 key购买 nike

你能解释一下下面的代码吗

int main() {
int value = 2;
int *ptrWithAmpersand = &value;
int *ptrWithoutAmpersand = value;
//printf("%d", *ptrWithoutAmpersand); 1) Why Runtime error.
printf("Pointer with & --> %d\n", *ptrWithAmpersand);
printf("Pointer withOUT & and * --> %d\n", ptrWithoutAmpersand); //2) Why this works??!!
getch();
}

如代码中注释

  1. 为什么会出现运行时错误?
  2. 为什么这有效?

输出为

Pointer with & --> 2
Pointer withOUT & and * --> 2

最佳答案

在行

int *ptrWithAmpersand = &value;

您正在创建一个指向 int 的指针,并将变量 value地址分配给它。到目前为止一切顺利。

在行

int *ptrWithoutAmpersand = value;

您正在创建一个指向 int 的指针,并将变量 value (2) 的内容分配给它。这会导致几个问题:

  1. 您正在尝试将 int 类型的值分配给 int * 类型的变量,这是不兼容的类型;编译器至少应该发出“赋值中的类型不兼容”或类似的警告(打开所有警告)

  2. 在您的系统上,2 不是有效的对象地址,因此当您尝试取消引用 ptrWithoutAmpersand 时会出现运行时错误。

您的代码中还有其他几个问题。您不应使用 %d 转换说明符来打印指针值;始终使用 %p 来实现此目的。

这里稍微重写了您的代码,以使某些事情更加清晰:

#include <stdio.h>

int main() {
int value = 2;
int *ptrWithAmpersand = &value;
int *ptrWithoutAmpersand = value; // throws a warning in gcc; you should not do this

printf("value of expression \"value\" = %d\n", value );
printf("value of expression \"&value\" = %p\n", (void *) &value );
printf("value of expression \"ptrWithAmpersand\" = %p\n", (void *) ptrWithAmpersand );
printf("value of expression \"*ptrWithAmpersand\" = %d\n", *ptrWithAmpersand );
printf("value of expression \"ptrWithoutAmpersand\" = %p\n", (void *) ptrWithoutAmpersand );

return 0;
}

这是代码的输出:

value of expression "value" = 2
value of expression "&value" = 0x7ffecb63cf44
value of expression "ptrWithAmpersand" = 0x7ffecb63cf44
value of expression "*ptrWithAmpersand" = 2
value of expression "ptrWithoutAmpersand" = 0x2

注意指针表达式与整数表达式的打印方式。

简而言之:

*ptrWithAmpersand    ==  value == 2        type == int
ptrWithAmpersand == &value type == int *
ptrWithoutAmpersand == value == 2 mismatched types int * and int

关于c - C 中的指针赋值、地址运算符和解引用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986120/

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