关于scanf传递整数值给指针及scanf("%d",ptr++)工作原理的技术问询
嘿,我来帮你逐个拆解这几个问题,带你搞清楚指针和scanf的工作逻辑:
1. 如何使用scanf()将整数值传入指针?
要让scanf()把整数存入指针指向的内存,核心是给scanf()传递指针指向的地址(其实就是指针变量本身的值,因为指针变量里存的就是目标内存的地址)。
scanf()的%d格式符要求对应参数是int*类型的指针,它会把用户输入的整数直接写入这个指针指向的内存位置。举个简单例子:
int num; int *ptr = # // 让ptr指向num的地址 scanf("%d", ptr); // 等价于scanf("%d", &num);
这里ptr里存的是num的地址,scanf()就会把输入的数值写入num所在的内存空间里。
2. scanf("%d",ptr++)的工作机制,以及输入值的存储位置
先拆解ptr++的行为:这里用的是后置自增运算符,意思是「先把当前ptr的地址值传给scanf(),再把ptr的地址往后挪一位」(因为是int*类型,每次挪的步长是sizeof(int),刚好对应数组下一个元素的位置)。
具体工作流程是:
- 每次循环时,先取当前
ptr指向的地址(比如第一次循环是numArray[0]的地址)传递给scanf(); scanf()将用户输入的整数,写入这个地址对应的内存位置(也就是numArray数组的对应元素里);- 完成输入后,
ptr自增,指向数组的下一个元素(比如从numArray[0]指向numArray[1])。
至于输入值的存储:输入的整数绝对不是存在指针变量里,而是存在指针指向的内存位置(也就是numArray的各个元素中)。指针本身只是一个「地址容器」,用来告诉scanf()该把数据写到哪里。
3. 为什么printf("%d", *ptr)会输出垃圾值?输入数据存在哪?
首先明确:你输入的10个整数,全部老老实实存在numArray数组的10个元素里了——因为每次scanf()都精准把数据写到了ptr当时指向的数组元素地址,从numArray[0]到numArray[9]一个不差。
那为什么会输出垃圾值?大概率是你后续代码中移动了ptr的位置,导致它指向了数组范围外的内存。比如看你没写完的代码片段,假设你在找最大值的循环里做了ptr++操作,那循环结束后ptr会指向numArray[10](数组下标从0到9,10已经超出范围了),这时候*ptr访问的是未定义的内存区域,自然输出垃圾值。
解决办法很简单:在执行printf前,把ptr重新指向数组的有效元素,比如ptr = numArray;,再执行printf("%d", *ptr);,就能输出你输入的第一个数值了。
内容的提问来源于stack exchange,提问作者Alfalfa Snow

