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

C语言基础:指针(数组指针与指针数组)

数组指针与指针数组

数组指针

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

特点:

  • 先有数组,后有指针

  • 它指向的是一个完整的数组

一维数组指针:

  • 语法:

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

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

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

二维数组指针:

  • 语法:

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

写法1:

#include <stdio,h>
 int main()
 {
     //创建一个普通的二维数组
     int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
    int len = sizeof(arr)/sizeof(arr[0]);
     //创建一个二维数组指针
     //一个二维数组本质上还是一个一维数组,只不过它的元素也是数组
     int (*p)[3][3] = &arr;
     printf("%d",(*p)[1][0]);
     //遍历
     for(int i = 0; i < len; i++)
     {
         for(int j = 0; j < len ; j++)
         {
         printf("%-5d\n",(*p)[i][j]);
         }
         printf("\n");
     }
 }

写法2:

#include <stdio,h>
 int main()
 {
     //创建一个普通的二维数组
     int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
    int len = sizeof(arr)/sizeof(arr[0]);
     //创建一个二维数组指针
     //一个二维数组本质上还是一个一维数组,只不过它的元素也是数组
     int (*p)[3] = arr; // 10
     printf("%d",(*p)[0]); //10
     //获取元素2000
     //三种写法:内部为行,外部为列
     printf("2000-%d,%d,%d",*(*(p+2)+1),*(p[2]+1),p[2][1]);
     
    return 0;
 }
  • 指针和数组中符号优先级:()> [] > *

  • 通过指针引用多维数组

案例1

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

 #include  <stdio.h>
 //用指向元素的指针变量指向二维数组元素的值
 int main()
 {
     //定义一个普通的二维数组
     int arr[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++)
     {
         //每4个换行
         if((p - arr[0]) % 4 ==0)
         {
             printf("\n");
         }
         printf("%-4d",*p)
     }
     printf("\n");
     return 0;
 }

案例2

需求:数组指针-输出二维数组任一行一列元素的值

#include <stdio.h>
 //数组指针-输出二维数组任一行一列元素的值
 int arr_main1()
 {
     //定义一个二维数组
     int arr[3][4] = {1,3,5,7,9,11,13,15,17,19.21.23};
     //创建一个一维的数组指针指向二维数组
     int (*p)[4] = arr; //等价于&arr[0] , p代表我们这个二维数组
     // 创建两个变量,代表我们对应数据的行和列
     int row,col;
     //通过控制台来输入
     printf("请输入行号和列号:\n");
     scanf("%d,%d",&row,&col);
     printf("arr[%d][%d] = %d\n",row,col,*(*(p+row)+col));//*(*(p+row)+col),*(p[row]+col),p[row][col]
 }
 int main()
 {
     return 0;
 }

指针数组

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

特点:

  • 先有指针,后有数组

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

语法:

 数据类型 *数组名[容量];
 int *arr[4];//int (*arr)[4] 这个是数组指针
#include <stdio.h>
 int main()
 {
     // 定义三个变量
     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]);//输出每个指针指向的值,需要解引用
     }
     return 0;
 }

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


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

相关文章:

  • 以太网帧结构
  • 【流量、洪水数据下载】网站介绍和下载经验....不断更新!
  • 【 CSS 】sass 扩展语言的安装
  • SpringBoot使用Validation校验参数
  • React引入Echart水球图
  • Hbase的特点、特性
  • sentinel笔记10- 限流规则持久化(下)
  • TypeScript 与后端开发Node.js
  • 实时、准实时、离线事件
  • uniapp中的条件编译
  • 【自动驾驶】3 激光雷达②
  • OpenLayers实现渐变透明填充和光效边界
  • 哈弗结构:深入浅出的理解
  • yolov8 label_studio 半自动化标注
  • 裴蜀定理和扩展欧几里得定理
  • 工业金融政务数据分类分级体系建设解读
  • WEB 漏洞 - 文件包含漏洞深度解析
  • Python+OpenCV系列:【打卡系统-工具模块设计】工具模块深度揭秘,考勤智能化的核心秘籍!
  • 无影云电脑的高性能与便捷性
  • 评估大语言模型在药物基因组学问答任务中的表现:PGxQA
  • 菜鸟带新鸟——基于EPlan2022的部件库制作(3D)
  • ubuntu 网络管理--NetworkManager
  • 硬件设计:LVDS电平标准
  • 抖音小程序登录(前端通过tt.login获取code换取openId)
  • 生成10级子目录,每个子目录下有100个不同大小的文件
  • 将现有环境192.168.1.100中的svn迁移至新服务器192.168.1.4;