C语言学习第九天(重要:C的灵魂)

本文详细解析了C++中数组与指针的基本操作,包括使用指针作为参数进行数组元素交换、查找数组中的最大值和最小值、多维数组的指针表示、输出二维数组元素、计算平均分及输出特定成绩等。文章涵盖了从一维到多维数组的操作技巧,以及如何通过指针灵活地访问和修改数组元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.以指针变量做参数

#include "stdio.h"
#define NUM 5
int main()
{
    int i,arr[NUM]={2,4,8,5,6};
    for(i=0;i<NUM;i++)
    {
        printf("%d",arr[i]);
    }
    printf("
");
          
    change(arr);
          
    for(i=0;i<NUM;i++)
    {
        printf("%d",arr[i]);
    }
    printf("
");
}
          
change(int arr[])
{
    int *p ,temp,*i,*j,m;
    m = (NUM-1)/2;
    /* 指针赋值 */
    i = arr;        
    j = arr+NUM-1;
    p = arr+m;
          
    for(;i<=p;i++,j--)
    {
        temp = *i;
        *i = *j;
        *j = temp;
    }
    return;
}



从一个数组中找出最大值和最小值

1.数组为参数

#include "stdio.h"
#define NUM 7
int max , min;
        
int main()
{
    void max_min(int arr[]);
    int i,arr[NUM]={2,4,8,1,9,5,6};
    for(i=0;i<NUM;i++)
    {
        printf("%d",arr[i]);
    }
    printf("
");
        
    max_min(arr);
        
        
    printf("max:%d,min:%d
",max,min);
}
        
        
void max_min(int arr[])
{
    int *_max,*_min,*arrend,*p;
    max = min =*arr;  //初始化
    arrend = arr+NUM;
            
    for(p=arr;p<=arrend;p++)
    {
        if(*p>max)
        {
            max = *p;
        }
        else if(*p<min)
        {
            min = *p;
        }
    }
        
    return;
        
}


2.指针为参数

#include "stdio.h"
#define NUM 7
int max , min;
       
int main()
{
    void max_min(int arr[]);
    int i,arr[NUM]={2,4,8,1,9,5,6};
    int *p ;
    p=arr;
    for(i=0;i<NUM;i++)
    {
        printf("%d  ",arr[i]);
    }
    printf("
");
       
    max_min(p);
       
       
    printf("max:%d,min:%d
",max,min);
}
       
       
void max_min(int *p)
{
    int *_max,*_min,*arrend;
    max = min =*p;
    arrend = p+NUM;
    int * b;
    for(b=p;b<arrend;b++)
    {
        if(*b>max)
        {
            max = *b;
        }
        else if(*b<min)
        {
            min = *b;
        }
    }
       
    return;
       
}



多维数组的指针:

二维数组比一维数组复杂难懂,概念不一样

例如:设

int arr[3][4] {{1,3,5,7},{9,11,13,15},{17,19,21,23}};

arr是一个二维数组,从二维数组的角度来看 arr是二维数组的首地址即第0行的的首地址arr+1代表第1行的首地址。

如果arr首地址为2000则arr+1为2008,因为第0行有4个整形数据(整形占2个字节)所以arr+1是arr[1]的地址即 arr+4*2=2008。

arr[0],arr[1],arr[2],arr[3]都是二维数组名即他们也是地址arr[0]代表第0行一维数组第0列元素的地址即&arr[0][0]。


表示形式                            含义                                  地址

a                                二维数组名,数组首地址,0行的地址        2000

a[0],*(a+0),*a                   第0行地址                                2000    

a+1,&a[1]                        第1行地址首地址                          2008    

a[1],*(a+1)                      第1行第0列地址                           2008  

a[1]+2,*(a+1)+2,&a[1][2]         第一行第二列地址                         2012  

*(a[1]+2),*(*(a+1)+2),a[1][2]    第一行第二列的值                         值13


用指针变量输出数组元素的值

#include <stdio.h>
main()
{
    int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21};
    int *p;
    for(p=a[0];p<a[0]+11;p++)
    {
        printf("%d  ",*p);
    }
}

输出二维数组任意一行任意一列的值:


#include <stdio.h>
main()
{
    int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
    int (*p)[4],i,j;    //*p有4个元素为整形 P所指向的是4个一维数组,即为行元素;
   
    p=a;
    scanf("i=%d,j=%d",&i,&j);
    printf("a[%d,%d]=%d
",i,j,*(*(p+i)+j));//*(p+i)为地址+J个位置再算它的值
}


一个班3学生,4门课,算平均分即第N个学生的成绩

#include <stdio.h>
main()
{
    void average(float *p,int n);
    void search(float (*p)[4],int n);
    float score [3][4] = {{65,67,70,62},{80,87,90,81},{90,99,100,98}};
    int se;
    average(*score,12);
    printf("print the score NO:");
    scanf("%d",&se);
    search(score,se-1);
}
 void average(float *p,int n)
 {
    float *p_end = p+n;
    float sum = 0, avg;
    for(;p<p_end;p++)
    {
        sum=sum+(*p);
    }
    avg = sum/n;
    printf("%.2f
",avg);
 }
  
 void search(float (*p)[4],int n)
 {
     printf("the score of NO.%d
",n+1);
     int i ;
     for(i=0;i<4;i++)
     {
        printf("%.2f    ",*(*(p+n)+i));
     }
 }


如果一门不及格,打印他所有的成绩:

#include <stdio.h>
main()
{
    void search(float (*p)[4],int n);
    float score [3][4] = {{65,67,70,62},{59,87,90,81},{90,99,100,98}};
    search(score,3);
}
 
 
 void search(float (*p)[4],int n)
 {
     int i ,j;
 
     for(i=0;i<n;i++)
     {
        int flag = 0;
        for(j=0;j<4;j++)
        {
            if(*(*(p+i)+j)<60)
            {
                flag = 1;
            }
        }
        if(flag==1)
        {
            for(j=0;j<4;j++)
            {
                printf("%.2f	",*(*(p+i)+j));
            }
        }
     }
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值