回顾二维数组——数组指针部分

news/2024/11/16 16:23:08 标签: c语言

数组指针才真正等同于二维数组名  

 

数组指针:

 当运行下面的代码的时候,会有警告,偏移量不同,arr++偏移的是整行数组,与注释的p++不同,如果p=&arr[0][0],p++表示的就是依次、连续的12个元素地址,偏移一个整型变量;因为数组元素是连续的地址空间,结果就会从arr[0][0]开始输出完整的12个数据,换成p=arr,arr++ 就会发出警告;解决的方法就是:运用数组指针,这样就与p++的情况相通了

直接运行,虽然能得到结果但是会有警告;如下

#include <stdio.h>
int main()
{
            /*数组指针的应用 */
    int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的
    int i,j;
    int *p;
   // p=&arr[0][0];
 
    p=arr;
                  //能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
                  //数组指针,定义一个指针,指向一个数组
    
    for ( i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
        //  printf("%p\n",arr[i]+j);
            printf("%p\n",*p++);//第i行第j列元素的地址

        }
    }
}

​//输出有警告
warning: assignment to 'int *' from incompatible pointer type 'int (*)[4]' [-Wincompatible-pointer-types]
     p=arr;
      ^

 添加数组指针后:

#include <stdio.h>
int main()
{
            /*数组指针的应用 */
    int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的
    int i,j;
    //int *p;
   // p=&arr[0][0];
    int (*p2)[4];
    p2=arr;
                  //能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
                  //数组指针,定义一个指针,指向一个数组
    
    for ( i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
        //  printf("%p\n",arr[i]+j);
            printf("%p\n",*(arr+i)+j);//第i行第j列元素的地址

        }
    }
}
//成功输出元素的地址
000000000061FDE0
000000000061FDE4
000000000061FDE8
000000000061FDEC
000000000061FDF0
000000000061FDF4
000000000061FDF8
000000000061FDFC
000000000061FE00
000000000061FE04
000000000061FE08
000000000061FE0C

 发现问题:发现p2与++p2的地址输出结果相同。分析:printf是从右往左开始输出打印的,先进行++p2后再p2,暂时先分开写

#include <stdio.h>
int main()
{
            /*数组指针的应用 */
    int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的
    int i,j;
    int *p;
   // p=&arr[0][0];
    int (*p2)[4]; //p2相当于一个一维数组了呀,
    p2=arr;
                  //能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
                  //数组指针,定义一个指针,指向一个数组
    printf("p2:%p,p2++=%p\n",p2,++p2);
    for ( i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
        //  printf("%p\n",arr[i]+j);
           // printf("%d\n",(*(arr+i)+j));//第i行第j列元素的地址
        }
    }
}
p2:000000000061FDF0,p2++=000000000061FDF0   //发现p2与++p2的地址输出结果相同
#include <stdio.h>
int main()
{
            /*数组指针的应用 */
    int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的
    int i,j;
    int *p;
   // p=&arr[0][0];
    int (*p2)[4]; //p2相当于一个一维数组了呀,p2包含4个元素的数组指针
    p2=arr;
                  //能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
                  //数组指针,定义一个指针,指向一个数组
    printf("p2:  %p\n",p2);
    printf("++p2:%p\n",++p2);
    for ( i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
        //  printf("%p\n",arr[i]+j);
           // printf("%d\n",(*(arr+i)+j));//第i行第j列元素的地址
        }
    }
}
p2:  000000000061FDE0
++p2:000000000061FDF0      //变了16,因为一行数组有四个元素

 //能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
 //数组指针,定义一个指针,指向一个数组
 //数组指针才真正等同于二维数组名 

#include <stdio.h>
int main()
{
            /*数组指针的应用 */
    int arr[3][5] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的
    int i,j;
    int *p;
   // p=&arr[0][0];
    int (*p2)[5]; //p2相当于一个一维数组了呀,p2包含4个元素的数组指针
    p2=arr;
                  //能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
                  //数组指针,定义一个指针,指向一个数组
                  //数组指针才真正等同于二维数组名
    printf("p2:  %p\n",p2);
    printf("++p2:%p\n",++p2);
    for ( i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
        //  printf("%p\n",arr[i]+j);
           // printf("%d\n",(*(arr+i)+j));//第i行第j列元素的地址
        }
    }
}


http://www.niftyadmin.cn/n/5754381.html

相关文章

sql专场练习(二)(1-5)

第一题 create database yhdb01; show tables ; create table sql2_1(uid int,subject_id int,score int ) row format delimited fields terminated by "\t"; load data local inpath /home/homedata/sql2/sql2_1.txt into table sql2_1; select * from sql2_1;100…

Vue.js 前端框架入门

简介 Vue.js 是一个构建用户界面的渐进式JavaScript框架。本文将带你了解Vue项目的目录结构&#xff0c;启动顺序&#xff0c;并逐步指导你安装必要的环境&#xff0c;以及如何开发一个基础的Vue项目。 需要的环境 Node.js&#xff1a;Vue.js 项目依赖于Node.js&#xff0c;…

Android 中的 Zygote 和 Copy-on-Write 机制详解

在 Android 系统中&#xff0c;Zygote 是一个关键的进程&#xff0c;几乎所有的应用进程都是通过它 fork&#xff08;派生&#xff09;出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势&#xff0c;这得益于 fork 操作和 Linux 中的 Copy-on-Write&#xff08;COW&am…

uni-app用户登录⑫

文章目录 十九、用户登录-账户名密码登录一、前端数据整理二、使用 store 进行用户信息存储 二十、用户登录-手机验证码登录一、验证码处理二、数据发送 十九、用户登录-账户名密码登录 一、前端数据整理 定义发送函数&#xff0c;将用户信息以及本次请求的用户登录类型传递给…

Linux之vim全选,全部复制,全部删除

Linux之vim全选&#xff0c;全部复制&#xff0c;全部删除 Vim中如何全选并复制&#xff1f; &#xff08;区分大小写&#xff01;&#xff01;&#xff01;&#xff09; 全部删除&#xff1a;按esc键后&#xff0c;先按gg&#xff08;到达顶部&#xff09;&#xff0c;然后d…

在uniapp中使用canvas封装组件遇到的坑,数据被后面设备覆盖,导致数据和前面的设备一样

在uniapp开发中使用canvas封装了一个叫cirlceTemp的组件(温度圆环图表) 封装的HTML代码 <template><view class"progress-box" :style"{ width: ${progressWidth}rpx, height: ${progressHeight}rpx }"><canvas class"progress-bg&qu…

蓝牙 AVRCP 协议详解及 Android 实现

文章目录 前言一、什么是蓝牙 AVRCP 协议&#xff1f;1.1 定义与功能1.2 AVRCP 的设备角色1.3 AVRCP 的版本发展 二、AVRCP 的工作原理2.1 配对与连接2.2 命令与响应2.3 元数据传输 三、AVRCP 在 Android 中的典型应用场景3.1 音乐控制3.2 车载媒体交互3.3 蓝牙遥控器 四、Andr…

MacOS下,如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能

MacOS下&#xff0c;如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能 在Mac上的Safari浏览器中&#xff0c;可以通过实况文本功能来实现图片中的文本翻译。关闭步骤具体步骤如下&#xff1a; 在浏览器地址栏&#xff0c;鼠标右击翻译按钮&#xff0c;然后点击“首选…