首页 > 其他分享 >C语言一维数组与指针运算

C语言一维数组与指针运算

时间:2024-12-31 23:55:46浏览次数:3  
标签:anum 一维 int 交换 C语言 数组 pi 指针

今天来着重讲解一下指针运算的方法遍历一维数组

基本原理

数组就是第一个数的地址,等价于一个指针,但是是开辟了空间的

我就可以除了数组 [ ] 写法操作,也可以用指针指着操作,这里语法也十分重要,通过一道题咱们都领略一遍指针运算

例题

任务描述
本关任务:编写程序,用指针实现以下功能,交换数组a和数组b中的对应元素,要考虑到数组a和数组b中数据元素的个数不同。

#include<stdio.h>
#define N 20
int main()
{
    int a[N]={ 0 }, b[N]={ 0 },temp;
    int anum,bnum;
    int *pi, *pj;
    /********** Begin *********/    
    

    
    /********** End **********/
}

 思路

这里有个问题,我们知道这两个数组实际长度可能不一样,比如a数组10个数字,b数组5个数字,这怎么交换?(这里的交换是逐个元素的交换,别直接数组交换,要不就没有难度了,不符合题干)

有一个思路,先交换公共部分,然后记住换到哪里了,接着继续把长的多出来的换到短的里,再把长的一部打印出来(不全部打印),这就是数学取交集的应用(死去的高中知识)

接下来就是相关实现

#include<stdio.h>
#define N 20
int main()
{
    int a[N]={ 0 }, b[N]={ 0 },temp;
    int anum,bnum;
    int *pi, *pj;
    /********** Begin *********/    
    scanf("%d",&anum);   //输入数组a元素个数
    for(pi=a;pi<a+anum;pi++)
    {
        scanf("%d",pi);
    }
    scanf("%d",&bnum);   //输入数组b元素个数
    for(pj=b;pj<b+bnum;pj++)
    {
        scanf("%d",pj);
    }
        
    /***** 交换两个数组a和b的值*****/
    for(pi=a ,pj=b;  pi<a+anum && pj< b+bnum; pi++, pj++)
    {
        temp =*pi;
        *pi = *pj;
        *pj = temp;
            
    }
    while( pi<a+anum)
    {
        *pj =*pi;
        pi++;
        pj++;
    }
    while( pj<b+bnum)
    {
        *pi =*pj;
        pj++;
        pi++;
    }
    temp = anum; 
    anum = bnum;
    bnum = temp;

    for( pi=a; pi<a+anum; pi++)
    {
        printf("%d ",*pi);
    }
    printf("\n");
     for( pi=b; pi<b+bnum; pi++)
    {
        printf("%d ",*pi);
    }
    
     return 0;
    /********** End **********/
}

 语法讲解

经典拿自己开刀

pi<a+anum就是等价于pi[i]<a[anum],但是指针写法不需要变量i

pi++等价于pi[i],i++,指针写法不需要变量i

scanf("%d",pi)等价于canf("%d",&pi[i]),这里注意,指针就是地址,不需要&

pi=a/pj=b也是重点,一定注意指针等于指针(数组名),所以不要额外添加 [ ]

for循环里面是交换公共部分

交换完之后,指针位置变化成下图

进行额外值录入

temp = anum; 
anum = bnum;
bnum = temp;

交换要读取的数组长度

总结

1、十分重要的指针运算语法

2、交换

3、针对长度不同的数组如何逐项交换(换交集取多项读取再限制) 

以上均是本人理解,如有不对欢迎各位大佬评论区指出~

12/31,祝各位新年快乐,2025事事如意

标签:anum,一维,int,交换,C语言,数组,pi,指针
From: https://blog.csdn.net/dyudbegdu/article/details/144858494

相关文章

  • Linux第一课:c语言 学习记录day01
    0、大纲1、Linux命令2、基础内容:进制转换、词法符号、变量常量、输入输出3、语句:分支语句、循环语句、循环控制语句4、数组:一维数组、字符数组、排序、二维数组5、指针:一级指针、二级指针、指针和数组、指针数组、数组指针6、函数:函数基本用法、string函数族、开辟堆区空......
  • C语言插入排序及其优化
    插入排序算法详解插入排序是一种简单直观的排序算法。它通过构建有序序列,将未排序部分的元素插入到已排序部分的正确位置,直到所有元素排序完成。下面是插入排序的关键点及其实现细节。算法思想从第二个元素(下标为1)开始,假定左侧的子数组已排序。将当前元素与已排序部分逐一......
  • 【C++11】智能指针
    目录指针标准库unique_ptr对应类方法创建unique_ptr对象的两种方法unique_ptr的使用特性shared_ptr类方法循环引用造成内存泄漏weak_ptrweak_ptr的创建三个方法功能例子1例子2指针普通指针:指向内存区域的地址变量当普通指针指向动态分配的内存的时候,即使这个指......
  • rust学习十五.3、智能指针相关的Deref和Drop特质
     一、前言智能指针为什么称为智能指针?大概因为它所包含的额外功能。这些额外的功能使得编码或者运行时让指针看起来更有效、并体现某些“智”的特征,所以,我猜测这应该是rust发明人这么称呼此类对象为智能的原因。 据前面有关章节所述,我们知道智能指针多基于结构体(struct)扩......
  • C语言数组名的理解
    一维数组intmain(){ inta[]={1,2,3,4}; printf("%zu\n",sizeof(a)); printf("%zu\n",sizeof(a+0)); printf("%zu\n",sizeof(*a)); printf("%zu\n",sizeof(a+1)); printf("%zu\n",sizeof(a[1])); prin......
  • C语言里面的size_t是什么意思
    size_t是C语言中一个非常常用的数据类型,主要用于表示对象的大小或计数。它定义在<stddef.h>、<stdio.h>、<stdlib.h>等标准头文件中。以下是对size_t的详细解释:size_t的定义和用途定义:size_t是一个无符号整数类型(typedef定义),其具体大小依赖于编译器和平台。通......
  • 万字带你彻底搞懂 C语言| 文件IO还不懂?看这篇就够了
    目录一、前言(必看)文件访问方式对比二、系统调用接口2.1打开文件:open函数示例代码一:以只读方式打开test.txt文件,文件不存在则报错示例代码二:以只写方式打开文件test.txt,文件不存在则创建,文件存在则清空示例代码三:验证一个进程(现在可以理解成一个程序)能打开的最大文件......
  • c语言 - 如何安全返回局部变量的地址
    c语言返回局部变量的地址在C语言中,返回局部变量的地址是不安全的行为,因为一旦函数执行完毕,局部变量的内存将被释放,返回的地址将指向未定义的内存区域,这将导致不可预知的行为。以下是一个返回局部变量引用的例子,这是错误的做法:#include<stdio.h>int*getVarAddr()......
  • C++项目链接C语言动态库
     有C++项目B,有C语言动态链接库A,需要在B程序中链接A库。 我们知道C++运行环境可以直接运行C语言程序,但因为C++编译时对方法名的解析不同,所以要在C++项目中运行C语言程序,关键问题是需要告诉C++编译器,按照C语言的规范来编译指定的C代码。上面所述的“指定的C代码”,包括C++项目中......
  • CSU中南大学OJ平台2024级C语言期末复习
        临近期末,相信还有人因OJ平台没做出来而发愁。没事的孩子们,我给你们带来了法宝,解题思路和代码。奇偶数做风车七夕节消消乐水果店问题V:奇偶数(20分)题目描述小南在网上看到了一个关于奇偶数的定义:如果一个正整数n既能拆成两个奇数之和也能拆成两个......