07-01-指针与数组

ops/2024/12/25 2:15:45/

1 动态创建二维数组

int rows, cols;
printf("请输入二维数组行数:");
scanf(" %d", &rows);
printf("请输入二维数组中列数:");
scanf(" %d", &cols);

//外层二维数组----二维指针
int** arr= (int**)malloc(rows * sizeof(int*));   //int*占8个字节
for (int i = 0;i < rows;i++) {
//动态创建一个指针----一维数组
    arr[i] = (int*)malloc(cols * sizeof(int));
    for (int j = 0;j < rows;j++) {
        arr[i][j] = j + 10;
        printf("%d ", arr[i][j]);
    }
    printf("\n");
}
free(arr);

2 指针与数组专题

int a = 10;
int* p = &a;
int** p1 = &p;//二级指针
printf("%d ", **p1);//取二级指针的值


//1.一维数组和指针
int arr[3] = { 10,20,30 };
//数组名是地址,相当于第一个元素的地址,数组名也是个常量,一但初始化完成,数据不能改变
int* ptr=NULL;//指针变量,可以对ptr赋值
ptr = arr;   //ptr=&arr[0];

//2.使用指针来访问数组             步长:数据类型的长度  ptr+1每次从首元素开始,ptr++每次以当前元素开始

//取元素20
printf("%d %d %d %d ", arr[1], *(arr + 1), *(ptr + 1), ptr[1]);//20 20 20 20

//取元素20
ptr++;
printf("%d %d ", *ptr, ptr[0]);//20 20 

//获取数组的最大值
int arr[3] = { 10,20,30 };
//方法一  假设第一项为最大值
int max = arr[0];
for (int i = 0;i < 3;i++) {
    if (max < arr[i]) {
        max = arr[i];
    }
}
printf("max=%d ", max); //max = 30

//方法二 使用指针
int* p = arr;
int max1 = *p;
for (int i = 0;i < 3;i++) {
    if (max1 < *(p + i)) {
        max1 = *(p+i);
    }
}    
printf("max1=%d ", max1); //max1 = 30

3 指针带下标的使用

int a[5] = { 10,20,30,40,50 };
int* p = a;
for (int i = 0;i < 5;i++){
    printf("%d ", p[i]);
}
for (int i = 0;i < 5;i++) {
    printf("%d ", p[0]);//p指向谁,谁是起点 例:当前p 指向a[3],则p[2]并不代表a[2],而是 a[3+2],即 a[5]
    p++;
}
printf("%p %p ", a, &a);// 000000CAF1F9F698 000000CAF1F9F698 
printf("%p %p %p ",a, a + 1,&a + 1);

//不是同一个地址 000000CAF1F9F698 000000CAF1F9F69C 000000CAF1F9F6AC 

4 指针和数组

4.1普通指针

int a = 10;
int* ptr = &a;

int arr[5] = { 10,20,30 };
int* ptr1 = arr;

4.2 数组指针     定义方式:数据类型(*ptr)[size]      优先级:( )>[ ]> *

int arr[10] = { 10,20,30 };
int(*ptr)[10] = &arr;//ptr是一个指向包含10个整数的数组的指针

int matrix[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };    // 声明一个3x4的二维数组
int arr[10] = { 10,20,30 };
int(*ptr)[4] = matrix; //ptr是一个指向包含4个整数的数组的指针,这个数组本身是一个二维数组的行

//数组方法  访问第一行第二列的元素
printf("%d ", matrix[0][1]);   //2
//指针方法  访问第一行第二列的元素
printf("%d ", (*ptr)[1]);     //2

//数组方法  访问第二行第一列的元素
printf("%d ", matrix[1][0]);//5
//指针方法  访问第二行第一列的元素
printf("%d ", (*(ptr+1))[0]);//5

//数组方法  访问第三行第三列的元素
printf("%d ", matrix[2][2]);//11
//指针方法  访问第二行第一列的元素
ptr++;
ptr++;
printf("%d ", (*ptr )[2]);//11

4.2.1遍历

for (int i = 0; i < 3; i++) { // 遍历行  
    for (int j = 0; j < 4; j++) { // 遍历列 
        printf("%d ", (*ptr)[j]);//    printf("%d ", matrix[i][j]);
    }
    printf("\n");    //1 2 3 4
                       //5 6 7 8
                     //9 10 11 12
    ptr++; // 移动到下一行  
}

4.3 指针数组 

int* arr[10];//arr是数组名  它里面的元素是指针

int a = 10;
int b = 20;
int c = 30;
int* arr[3] = { &a,&b,&c };
for (int i = 0;i < 3; i++) {
    printf("%d ", *arr[i]);
}

    int line1[] = { 1,2,3,4 };// 矩阵第一行
    int line2[] = {5,6,7,8};
    int line3[] = {9,10,11,12};
    int* ptr[3] = {line1,line2,line3};

    for (int i = 0;i < 3;i++) {
        for (int j = 0;j < 4;j++) {
            printf("%d ", ptr[i][j]);
        }
    }

数组指针vs指针数组

(1)数组指针一定是指针

int(*ptr)[10];  //ptr是指针变量   指针变量指向的是包含十个元素的一维数组  应用场景:二维或多维

(2)指针数组一定是数组    数组中的元素是指针

int* arr[10];//arr是数组名,里面的元素是指针


http://www.ppmy.cn/ops/144722.html

相关文章

Linux 下SVN新手操作手册

下面来介绍Linux 下 SVN操作方法&#xff1a; 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装&#xff0c;官方地址&#xff1a;https://subversion.apache.org/ 2、SVN的使用…

【Chrome Extension】一、CSDN计时扩展设计

【Chrome Extension】一、CSDN计时扩展设计 重点内容内容脚本 content_scripts 文件目录1、整体目录2、manifest.json3、scripts/content.js4、css/content.css 重点内容 内容脚本 content_scripts 1、manifest.json文件配置 {"manifest_version": 3, # *依赖Chro…

如何从 ASP.NET Core IIS上传大文件一些配置

使用ASP.NET Core上传文件&#xff0c;可以参考官方文档&#xff1a; 使用缓冲模型绑定上传小文件到物理存储。 默认情况下&#xff0c;Windows IIS 将maxRequestLength和maxAllowedContentLength分别限制为 4096 KB 和 30,000,000 字节。要上传大于这些限制的文件&#xff0c;…

油漆面积(2017年蓝桥杯)

时间限制 2s 内存限制 256M 问题描述&#xff1a;X星球的一批考古机器人正在一片废墟上考古。该区域的地面坚硬如石、平整如镜。管理人员为了方便&#xff0c;建立了标准的直角坐标系。每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。经过各种测量&#xff0c;每个…

智能文档处理百宝箱,文档处理的必备利器

1、引言 文档解析是开发者在业务实践中会频繁面临的场景&#xff0c;不管是用AI辅助日常工作&#xff0c;还是从事产品研发&#xff0c;从非结构化文本中提取文字、图片等信息具有很大的挑战。 目前市面上的文档解析工具普遍存在繁杂无序&#xff0c;缺乏统一评估标准&#xff…

MySQL InnoDB 存储引擎 Redo Log(重做日志)详解

1 Redo Log 的作用与重要性 Redo Log 是 InnoDB 存储引擎中用于实现事务持久性和崩溃恢复的关键组件。它的主要功能是记录对数据库页&#xff08;page&#xff09;所做的物理修改&#xff0c;确保即使在系统崩溃的情况下&#xff0c;已经提交的事务也不会丢失&#xff0c;并且可…

git命令恢复/还原某个文件、删除远程仓库中的文件

有时刚创建的远程仓库&#xff0c;可能无意中把一些没用的文件上传到仓库&#xff0c;本文介绍一下怎么删除这些文件。 一、git命令恢复某个文件 第一步&#xff1a;拉取最新代码 git pull 第二步&#xff1a; 查看git 修改的文件状态 git status 第三步&#xff1a;查看…

信管通低代码信息管理系统应用平台

目前&#xff0c;国家统一要求事业单位的电脑都要进行国产化替代&#xff0c;替代后使用的操作系统都是基于linux的&#xff0c;所有以前在WINDOWS下运行的系统都不能使用了&#xff0c;再者&#xff0c;各单位的软件都很零散&#xff0c;没有统一起来。需要把日常办公相关的软…