C/C++利用指针变量输入输出数组元素

【算法代码】
通过指针变量 p 输入输出数组元素的代码如下所示。

cpp 复制代码
#include <stdio.h>

int main() {
    int a[6];
    int *p;
    for(p=a; p<a+6; p++) scanf("%d",p); //通过指针变量p输入数组元素
    p=a;
    for(p=a; p<a+6; p++) printf("%d ",*p); //通过指针变量p输出数组元素
    printf("\n");
    return 0;
}

/*
in:6 5 4 3 2 1
out:6 5 4 3 2 1
*/

【算法分析】
● 本代码的关键点,在于理解代码 for(p=a; p<a+6; p++) scanf("%d",p); 的功能是通过指针变量 p 给数组 a[] 输入元素。
要理解此语句,必须先理解 scanf 语句的用法。scanf 函数的一般形式为:

cpp 复制代码
scanf(格式控制,地址表列);

注意,++scanf 函数中的第二部分参数为++++地址++ ++表列++。因此,就不难理解如下的常见输入语句例子:

cpp 复制代码
int x;
scanf("%d",&x);

显见,上面代码的 scanf 函数中的第二部分 &x 是地址,满足 scanf 函数的一般形式,其功能是给 x 赋值。而在本例代码中,p 是指针(即地址),所以 scanf("%d",p); 满足 scanf 函数的一般形式。又由于数组名 a 是指针常量,指向数组首元素 a[0],且在 for 循环中初始化 p=a,所以此时语句 scanf("%d",p); 中的 p 就是数组首元素 a[0] 的地址,故 scanf("%d",p); 就等价于给数组元素 a[0] 赋值。然后,随着 p 值的变化,就等价于给 a[1]、a[2]、...... 等赋值。

● 至于本代码的输出就好理解多了。本例代码第 7 行,通过 p=a,让 p 重新指向数组首元素,然后利用循环,输出 *p 中的内容,即数组 a[] 的内容。

● 利用 scanf 给指针变量赋值的正确代码为:

cpp 复制代码
int *p;
scanf("%d",p);

而不是如下错误的代码:

cpp 复制代码
int *p;
scanf("%d",&p);
相关推荐
Smile丶凉轩3 分钟前
微服务即时通讯系统的实现(服务端)----(1)
c++·git·微服务·github
萝卜兽编程27 分钟前
优先级队列
c++·算法
珹洺2 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
孙同学要努力2 小时前
C++知识整理day1——前置基础知识整理(命名空间、输入输出、函数重载、引用)
开发语言·c++
沐泽Mu2 小时前
嵌入式学习-C嘎嘎-Day05
开发语言·c++·学习
几窗花鸢2 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode
Beau_Will2 小时前
数据结构-树状数组专题(1)
数据结构·c++·算法
hunandede3 小时前
av_image_get_buffer_size 和 av_image_fill_arrays
c++
怀澈1224 小时前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
chnming19875 小时前
STL关联式容器之set
开发语言·c++