当前位置: 首页 > article >正文

C语言基础十一:指针变量与数组;数组指针及指针数组

指针变量指向数组

通过指针引用数组元素

引用一个数组元素,可以用:

引用一个数组元素,可以用:

①下标法:如 a[i]形式

②指针法:如 *(a+i)或者 *(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值:p=a;
在这里插入图片描述

数组名作函数参数

表现形式:

1.形参和实参都是数组名

void fun(int arr[],int len);
void main()
{
	int arr[]={11,12,13};
	fun(arr,sizeof(arr)/sizeof(arr[0]));
}

2.实参用数组名,形参用指针变量

void fun(int *p,int len);
void main()
{
	int arr[]={11,12,13};
	fun(arr,sizeof(arr)/sizeof(arr[0]));
}

3.实参形参都用指针变量

void fun(int *p,int len);
void main()
{
	int arr[]={11,12,13};
	int *p =arr;
	fun(p,sizeof(arr)/sizeof(arr[0]));
}

4.实参为指针变量,形参为数组名

void fun(int arr[],int len);
void main()
{
	int arr[]={11,12,13};
	int *p =arr;
	fun(p,sizeof(arr)/sizeof(arr[0]));
}
案例
/*
需求:将数组a中n个整数按相反顺序存放
1.使用数组实现
*/
#include <stdio.h>
void inv(int arr[],int len)
{
    //反转思路:将第0个和n-1个对调,将第1个和n-2个对调
    int i=0;temp;
    //遍历数组
    for(;i<len/2;i++)
    {
        temp = arr[i];
        arr[i] = arr[len-1-i];
        arr[len-1-i]=temp;
    }
}
/*
数组的反转:指针实现
const给变量的数据类型前面添加const,代表这个变量是只读变量,无法对此作出修改
*/
void inv2(int *p,const int len)
{
    int *i=p,*p=&arr[len -1],temp;
    //遍历数组
    for(;i<j;i++,j--)
    {
        temp = *i;
        *i = *j;
        *j = temp;
    }
}
void get(int arr[],int len)
{
    for(int i =0;i<len;i++)
    {
        printf("%d",arr[i]);
    }
    printf("\n");
}
int main ()
{
    int arr[] = {11,22,33,44,55,66};
    printf("%d",inv(int arr,int len));
  	printf("%d",get(int arr,int len));
    return 0;
}

数组指针与指针数组

数组指针

概念:数组指针是指向数组的指针,本质上还是指针

特点:

  • 先有数组,后有指针
  • 它指向的是一个完整数组

一维数组指针:

  • 语法

    数据类型 (*指针变量名)(容量);
    
  • 案例:

    /**
    数组指针:指向数组的指针(这里不是指向数组元素的指针)
    */
    #include <stdio.h>
    
    int main()
    {
        //一维数组指针
        //先有数组,再有指针
        int arr[] = {100,200,300};
        int len =sizeof(arr)/sizeof(arr[0]);
        //int *p=arr;实际上还是指针变量
        int(*p)[3]=arr;//此时p不是指向arr数组的第一个元素,而是指向arr这个数组本身
        printf("%p\n",p);
    	//p++;此时p++会跳出整个数组,访问到一块未知的内存,程序中尽量避免这种写法
       // printf("%p\n",p);
       //如何访问数组指针
        printf("%d\n",((*p)[2]));//300
        //遍历
        for(int i =0;i<len;i++)
        {
            printf("%d",(*p)[i]);
        }
        printf("\n");
        return 0;
    }
    

我们之前所学的是指向数组元素的指针,本质上还是指针变量;现在我们学的是指向数组的指针,叫作数组指针。

二维数组指针

  • 语法

    数据类型 (*指针变量名)[行容量][列容量];
    
  • 案例

    #include <stdio.h>
    int main()
    {
        int arr[][3]={10,20,100,200,300,1000,2000,3000}
    	//创建一个二维数组的指针
        //一个二维数组本质上还是一个一位数组,只不过它的元素也是数组
        int (*p)[3][3]=&arr;
        printf("%d",(*p)[1][0]);
        //遍历
        for(int i = 0; sizeof(arr)/sizeof(arr[0]);i++)
        {
            int len = sizeof(arr[i])/sizeof(int);
            for(int j =0;j<len;j++)
            {
                printf("%d",(*p)[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    
    #include <stdio.h>
    int main()
    {
        int arr[][3]={10,20,100,200,300,1000,2000,3000}
    	//创建一个二维数组的指针
        //一个二维数组本质上还是一个一位数组,只不过它的元素也是数组
        int (*p)[3][3]=arr;
        printf("%d",(*p)[0]);//10
        //三种写法:第一种内部为行,外部为列
        printf("2000-%d,%d,%d",*(*(p+2)+1),p[2][1],*(p[2]+1); 
    }
    
  • 通过指针引用多维数组

在这里插入图片描述

案例

需求:用指向元素的指针变量输出二维数组元素的值

#include <stdio.h>
int main()
{
    //定义一个普通的二维数组
    int[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    //定义一个指针变量,用来接收二维数组的元素值
    int *p =arr[0];//&arr[0][0]
    //循环遍历
    for(;p<arr[0]+12;p++)
    {
        if((p-arr[0])%4==0)
        {
          printf("\n");  
        }
        printf("%d",*p);
    }
    printf("\n");
    return 0;  
}
案例2
/*
需求:数组指针-输出二维数组任一行任一列的值
*/
void arr_fun1()
{
    //定义一个普通的二维数组
    int arr[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    //定义一个指针变量,用来接收二维数组的元素值
    int (*p)[4] =arr;
    //创建两个变量,代表对应数据的行和列
    int row,col;
    printf("请输入行号和列号:\n");
    scanf("%d %d",&row,&col);
    printf("arr[%d][%d]=%d\n",row,col,*(*(p+row)+col));
    //循环遍历
    for(;p<arr[0]+12;p++)
    {
        if((p-arr[0])%4==0)
        {
          printf("\n");  
        }
        printf("%d",*p);
    }
    printf("\n"); 
}
指针数组

概念:指针数组是一个数组,数组中的每一个元素都是指针

特点:

  • 先有指针,后有数组
  • 指针数组的本质是一个数组,只是数组中的元素类型为指针

语法

数据类型 *数组名[容量]

案例:

#include <stdio.h>
{
    //定义三个变量
    int a=10,b=20,c=30;
    //定义指针数组,指针数组用来存放指针的
    int *arr[3] = {&a,&b,&c};
    //获取数组大小
    int len = sizeof arr/ sizeof arr[0];
    
    //遍历数组
    for(int i =0;i<len;i++)
        printf("%-3d",*arr[i]);//输出每个指针指向的值,需要解引用
    printf("\n");
    return 0;
}

nclude <stdio.h>
{
//定义三个变量
int a=10,b=20,c=30;
//定义指针数组,指针数组用来存放指针的
int *arr[3] = {&a,&b,&c};
//获取数组大小
int len = sizeof arr/ sizeof arr[0];

//遍历数组
for(int i =0;i<len;i++)
    printf("%-3d",*arr[i]);//输出每个指针指向的值,需要解引用
printf("\n");
return 0;

}


建议:我们一般使用指针数组处理字符串

http://www.kler.cn/a/444549.html

相关文章:

  • 未来趋势系列 篇五:自主可控科技题材解析和股票梳理
  • javaScriptBOM
  • linux-----网络编程
  • android recycleview 中倒计时数据错乱
  • linux---多线程
  • 【网络云计算】2024第51周-每日【2024/12/17】小测-理论-解析
  • 【k8s集群应用】K8S二进制安装大致步骤(简略版)
  • windows免登录linux
  • 前端学习-VUE
  • 探秘 Web3:重塑互联网的新力量
  • 【unity小技巧】unity最全的性能优化方案分享以及如何进行性能测试(2024/11/11更新)
  • 【蓝桥杯每日一题】选数异或——线段树
  • 【linux】shell(38)-数组
  • Micro Sip 配置自己的freeswitch服务器地址
  • SpringBoot如何实现缓存预热?
  • 语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限
  • web全局实现文字的中英文的切换
  • 航电系统组成架构详解!
  • Linux-进程描述符 task_struct 详解(PCB)
  • ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟
  • Cherno C++学习笔记 P42 this关键字
  • Ubuntu 22.04,Rime / luna_pinyin.schema 输入法:外挂词库,自定义词库 (****) OK
  • ECharts柱状图-柱图42,附视频讲解与代码下载
  • 防御 XSS 的七条原则
  • Linux安装部署Redis(超级详细)
  • Python Post JSON 下载压缩包