C语言中能否将scanf与*(array + i)指针写法配合使用?
关于在scanf中使用*(array + i)的疑问解答
嘿,这个问题问得很到位!我来帮你把这个点讲明白~
首先得回忆一下scanf的核心要求:它需要接收变量的地址,这样才能把输入的值写入到对应的内存位置里。而你已经知道array[i]和*(array + i)是等价的——这俩都是数组第i个元素的值,不是地址。
那你写的scanf("%i", *(array + i))为啥不对呢?因为这里的*(array + i)是个int类型的数值,而scanf的%i格式符需要的是int*类型的指针(也就是地址),类型不匹配会直接导致未定义行为,程序大概率会崩溃或者出现奇怪的结果。
那正确的用法是什么?其实很简单:array + i本身就是第i个元素的地址!
因为数组名array在大多数场景下会退化为指向数组第一个元素的指针,array + i就是指针向后偏移i个int长度的位置,完全等价于&array[i]。所以你只需要把代码写成这样:
scanf("%i", array + i);
给你举个完整的示例代码,方便你理解:
#include <stdio.h> int main() { int nums[3]; // 用array + i的方式读取输入 for (int i = 0; i < 3; i++) { printf("请输入第%d个数字:", i+1); scanf("%i", nums + i); } // 用*(array + i)的方式输出验证 printf("你输入的数字是:"); for (int i = 0; i < 3; i++) { printf("%i ", *(nums + i)); } return 0; }
总结一下:
*(array + i)=array[i]:表示数组第i个元素的值,适合用在printf这类需要读取值的场景array + i=&array[i]:表示数组第i个元素的地址,适合用在scanf这类需要写入值的场景
内容的提问来源于stack exchange,提问作者user9466449
相关产品推荐
相关产品推荐

