用指针和数组下标打印数组的问题

在看视频学习中产生了这样的疑问,这两种方式有什么优劣之分吗?还是说单纯借此给我们介绍指针的例子。
用指针时;

int main()
{
    int arr1[] = { 1,2,3,4,5 ,6,7,8,9,10 };
    int* p = arr1;
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d\n", (*p+i));
    }
    return 0;

}

用数组下标时;

int main()
{
    int arr1[] = { 1,2,3,4,5 ,6,7,8,9,10};
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d\n", arr1[i]);
    }
    return 0;

}

在打印数组元素这个具体的例子中,使用指针和使用数组下标两种方式都可以正确地打印数组的元素。这两种方式的选择通常取决于编程习惯和代码的可读性。
使用指针的方式可以通过指针的移动来遍历数组,通过*p访问指针指向的元素。这种方式更加灵活,特别适合在处理复杂的数据结构或者进行指针运算的情况下使用。但是,对于简单的数组遍历,使用指针可能会使代码稍微复杂一些,对于不熟悉指针操作的人来说可读性可能较差。
使用数组下标的方式直观明了,通过数组的索引直接访问数组元素。这种方式简单直接,易于理解和使用。在简单的数组遍历情况下,使用数组下标可以使代码更加清晰易懂。
综上所述,两种方式没有绝对的优劣之分,而是根据具体的需求和编程习惯选择合适的方式。在处理复杂的数据结构或者进行指针运算时,可以考虑使用指针方式;在简单的数组遍历情况下,使用数组下标方式更加直观和简单。

使用指针 和 使用 数组取下标,本质上没有什么区别,都是可以使用的。 数组的简单明了

指针要注意一下 :

*p+i  和  *(p + i)  是有区别的,
*p+i   每次 取得都是 第一个元素 ,然后 加上 i
*(p + i) 依此 从第一个元素地址开始取值,一直到最后一个元素地址取值
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7576671
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:单向链表的创建及简单使用(以学生管理为例,持续更新)
  • 除此之外, 这篇博客: 嵌入式软件学习问题汇总(一)什么是嵌入式?中的 单片机系统与嵌入式系统的差别 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •   要了解单片机,就要追溯到上世纪早期在没有大规模集成电路技术的时代,计算机的设计原理,那时的计算机CPU、随机存储器RAM、只读存储器ROM、各种外设I/O和中断系统ROM等这些都是分离在电路板的各个角落里。直到20世纪70年代左右,随着科学技术的不断发展,利用大规模集成电路技术把CPU和数据存储器(RAM)、程序存储器(ROM)及其他I/O通信口集成在一块芯片上,构成一个最小的计算机系统,这个就是单片机。
      那么跟单片机先比较嵌入式有哪些不同的地方呢?单片机产品和嵌入式产品都是电子产品,整个SOC都以CPU作为核心内嵌各种存储器,都有一些外围硬件作为辅助,也都是通过软件控制硬件。在功能上有很多的相似之处。但是在SOC性能上有非常巨大的差别,例如在内存方面,嵌入式系统的SOC明显比单片机大很多。现在将单片机与嵌入式系统SOC内存资源进行比较(顺便与PC机SOC进行比较):
      1、一般单片机系统中内存需求小,而且希望开发尽肯能的简单,因单片机SOC内嵌小容量的SRAM加小容量的NorFlash。
      2、嵌入式系统内存需求大,因为大容量的Norflash相对较贵,因此嵌入式SOC一般采NANDFlash+Dram+Sram+少量Srom。
      3、一般PC机都是:小容量的NorFLash+大容量的硬盘(类似于Nandflash)+大容量的Dram。
      可见在硬件上三者之间就存在较大的差别。
      嵌入式系统和单片机系统在CPU方面也是有一定差异:是否有MMU(分页内存管理单元,它是一种负责处理CPU的内存访问请求的计算机硬件),当然操作系统方面两者也具有一定差异,单片机系统因为内存资源较少的缘故,因此在操作系统移植方面一般只能跑一些简单的RTOS,像51单片机这样的简单SOC甚至连一些轻量级的RTOS都跑不了,哪怕能跑也没人会用它去跑操作系统(有朋友跟我说能跑,他跑过,纯粹是自己在玩呢,是不是),而嵌入式系统就比较牛了,一般在嵌入式系统中都会跑Linux、Android操作系统。(一般分需不需要比较友好的人机交互界面,不需要的一般都是跑LINUX,像平板、手机一般都是跑的Android,当然Android是基于Linux内核的,这个大家也要了解一下)最后,单片机与嵌入式在应用领域也是有较大差异的,单片机一般应用在操作简单的智能家电(如智能台灯),嵌入式一般运用领域较广(例如工业领域、汽车、航空航天等等都需要嵌入式)。这也是我们学习嵌入式的原因所在。

  • 您还可以看一下 刘建萍老师的人工智能系列课程零基础讲解知识点和实例应用线性回归梯度下降逻辑回归课程中的 讲解机器学中会涉及到的有关数学方面的知识储备有哪些小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于使用指针和数组下标两种方式去打印数组的问题,两种方式都是可行的,但是各有优劣。

    使用数组下标打印的优点是速度快、访问方便。缺点是不能进行越界的保护,假如用户使用了越界的下标,会导致程序崩溃。比如:

    int a[5] = { 1, 2, 3, 4, 5 };
    int i;
    for (i = 0; i <= 5; ++i) {
        printf("%d\n", a[i]);
    }
    

    以上代码将会输出前5个元素的值,但也会尝试访问第6个元素,导致崩溃。因此,如果需要进行下标越界的检查,数组下标打印就不能做到。

    使用指针打印的优点是可以进行越界检查,代码更加健壮。缺点是不如数组下标快速访问,并且也不能保证不会出现空指针访问等问题。比如:

    int *a = malloc(sizeof(int) * 5);
    a[1] = 2;
    printf("%d\n", *(a + 1));
    free(a);
    a = NULL;
    printf("%d\n", *(a + 1)); // 这里会出现空指针访问异常
    

    以上代码出现了空指针访问,导致程序崩溃。

    代码示例:

    数组下标打印示例代码:

    #include <stdio.h>
    
    int main() {
        int a[5] = { 1, 2, 3, 4, 5 };
        int i;
        for (i = 0; i < 5; ++i) {
            printf("%d\n", a[i]);
        }
        return 0;
    }
    

    指针打印示例代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int i;
        int *a = malloc(sizeof(int) * 5);
        for (i = 0; i < 5; ++i) {
            *(a + i) = i + 1;
        }
        for (i = 0; i < 5; ++i) {
            printf("%d\n", *(a + i));
        }
        free(a);
        return 0;
    }
    

    以上示例代码中,基本实现了数组的打印,但是没有进行内存越界检查和空指针判断等处理。在实际的项目中需要进行相关的处理,让代码更加健壮和安全。