c: two-dimensional array

news2024/11/17 10:35:13
/**
 * *****************************************************************************
 * @file        twoDimensional.h
 * @brief       二维数组  Pointers and 2-D arrays
 * @author       geovindu,Geovin Du,涂聚文 (geovindu@163.com)
 * ide: vscode c11,c17  windows 10
 * @date        2023-10-30
 * @copyright   geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants
 * matrix            =>    Points to base address of two-dimensional array.
                           Since array decays to pointer.
 
*(matrix)            =>    Points to first row of two-dimensional array.
*(matrix + 0)        =>    Points to first row of two-dimensional array.
*(matrix + 1)        =>    Points to second row of two-dimensional array.
 
**matrix             =>    Points to matrix[0][0]
*(*(matrix + 0))     =>    Points to matrix[0][0]
*(*(matrix + 0) + 0) =>    Points to matrix[0][0]
*(*matrix + 1)       =>    Points to matrix[0][1]
*(*(matrix + 0) + 1) =>    Points to matrix[0][1]
*(*(matrix + 2) + 2) =>    Points to matrix[2][2]
 * *****************************************************************************
 */
 
#ifndef TWODIMENSIONAL_H_
#define TWODIMENSIONAL_H_
  
#include <stddef.h>
#include <stdbool.h>
  
 
#define BUF_LEN 100                    // Length of input buffer
#define COUNT   5                 // Initial number of strings
 /**
 * @brief      输入字符排序
 *
 */
void stringInputSort();
 /**
  * @brief
  *
  * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
  * @return int
  */
 int pointDisplay(const int** arry,int row,int col);
  
 
  /**
  * @brief      
  * @param arry  二维数组
 * @param row 行长度
 * @param col 列长度
  * @return int
  */
  int pointDisplay1(const** arry,int row,int col);
 /**
 * @brief  
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
 int pointDisplay0(int arry[10][10],int row,int col);
 
/**
 * @brief  OK
 *
 * @param arry 二维数组
 * @param intlength 行列共长度
 * @return int
 */
int pointDisplay2(int arry[10][10],int intlength);
  
  
  
/**
 * @brief
 *
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay3(int** arry,int row,int col);
  
  
/**
 * @brief       Ok
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay4(int** arry,int row,int col);
  
  
/**
 * @brief    OK  
 * @param arry 二维数组
  * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay5(int*** arry,int row,int col);
 
/**
 * @brief   ok   
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay6(int** arry,int row,int col);
 
 
/**
 * @brief 释放所有堆内存     
 * @param ps
 * @param n
 *
 */
void freeMemoryChar(char **ps,size_t n);
 
 
 
/**
 * @brief 释放所有堆内存     
 * @param ps
 * @param n
 *
 */
void freeMemoryInt(int **ps,size_t n);
 
 
 
 
  
#endif
/**
 * *****************************************************************************
 * @file        twoDimensional.c
 * @brief       二维数组  Pointers and 2-D arrays
 * @author      geovindu,Geovin Du,涂聚文 (geovindu@163.com)
 *  ide: vscode c11,c17  windows 10
 * @date        2023-10-30
 * @copyright   geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants
 * *****************************************************************************
 */
 
#include <stddef.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "include/twoDimensional.h"
  
 
 
/**
 * @brief      输入字符排序
 *
 */
void stringInputSort()
{
 
    char buf[BUF_LEN];                  // Input buffer
    size_t str_count = 0;               // Current string count
    size_t capacity = COUNT;            // Current maximum number of strings
    char **pS = calloc(capacity, sizeof(char*));    // Pointers to strings
    char** psTemp = NULL;               // Temporary pointer to pointer to char
    char* pTemp = NULL;                 // Temporary pointer to char
    size_t str_len = 0;                 // Length of a string
    bool sorted = false;                // Indicated when strings are sorted
 
    printf("Enter strings to be sorted, one per line. Press Enter to end:\n");
 
    // Read in all the strings
    char *ptr = NULL;
    while(true)
    {
        ptr = fgets(buf, BUF_LEN, stdin);
        if(!ptr)                          // Check for read error
        {
            printf("Error reading string.\n");
            free(pS);
            pS = NULL;
            return 1;
        }
 
        if(*ptr == '\n') break;           // Empty line check
 
        if(str_count == capacity)
        {
            capacity += capacity/4;          // Increase capacity by 25%
 
            if(!(psTemp = realloc(pS, capacity))) return 1;
 
            pS = psTemp;
        }
        str_len = strnlen(buf, BUF_LEN) + 1;  //strnlen_s
        if(!(pS[str_count] = malloc(str_len))) return 2;
        strcpy_s(pS[str_count++], str_len, buf);
    }
 
    // Sort the strings in ascending order
    while(!sorted)
    {
        sorted = true;
        for(size_t i = 0 ; i < str_count - 1 ; ++i)
        {
            if(strcmp(pS[i], pS[i + 1]) > 0)
            {
                sorted = false;               // We were out of order so...
                pTemp= pS[i];                 // swap pointers pS[i]...
                pS[i] = pS[i + 1];            //       and...
                pS[i + 1]  = pTemp;           //     pS[i + 1]
            }
        }
    }
 
    // Output the sorted strings
    printf("Your input sorted in ascending sequence is:\n\n");
    for(size_t i = 0 ; i < str_count ; ++i)
    {
        printf("%s", pS[i] );
        free(pS[i]);                      // Release memory for the word
        pS[i] = NULL;                     // Reset the pointer
    }
    free(pS);                           // Release the memory for pointers
    pS = NULL;                          // Reset the pointer
 
}
 
 /**
  * @brief  可以
  *
  * @param arry  二维数组
 * @param row 行长度
 * @param col 列长度
  * @return int
  */
 int pointDisplay(const** arry,int row,int col)
  {
    //在main 中直接使用可以
    printf("\n6指针遍历二维数组\n");
    int *dup;
    //dup= arry[0];  //*(*(arry + 0));//*(arry + 0);//
    for (int i = 0; i < row; i++) //sizeof(arry) / sizeof(int)
    {
        dup= arry[i];
        for(int j=0;j<col;j++)
        {
            printf("%d ",*dup++);
        }
        printf("\n");
    }
    printf("\n");
 }
 
 /**
  * @brief      
  * @param arry  二维数组
 * @param row 行长度
 * @param col 列长度
  * @return int
  */
  int pointDisplay1(const** arry,int row,int col)
  {
    //在main 中直接使用可以
    printf("\n7指针遍历二维数组\n");
    int* dup;
    for (int i = 0; i < row; i++) //sizeof(arry) / sizeof(int)
    {
        dup=arry[i];//*arry;// 
        for(int j=0;j<col;j++)
        {
             // printf ("%d \t", *(dup+i));   //printf("\n");    //显示了第一行
              printf ("%d \t", *(dup+j)); 
        }
        //printf("%d ",*dup++);
        printf("\n");
    }
    printf("\n");
 }
 
 
/**
 * @brief  
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
 int pointDisplay0(int arry[10][10],int row,int col)
 {
 
    printf("\n14指针遍历二维数组\n");
    int *dup;
    dup=&arry[0][0];
    for (int i=0; i<row; i++){
      for (int j=0; j<col; j++){
         printf ("%d \t", *(dup+i*col+j));
      }
      printf("\n");
  
    }
 
    int (*pp)[col]=arry;
    printf("\n1列的首位元素\n");
    for(int k=0;k<row;k++)
    {
          printf(" %d ",*pp[k]); //列的首位元素
    }
    printf("\n");
    printf("\n2第一行的遍历值\n");
    for(int k=0;k<row;k++)
    {
         printf(" %d ",(*pp)[k]); //第一行的遍历值
    }
    printf("\n");
 
 }
/**
 * @brief
 *
 * @param arry 二维数组
 * @param intlength 行列共长度 row*col
 * @return int
 */
int pointDisplay2(int arry[10][10],int intlength)
{
  
    printf("\n9 指针遍历二维数组\n");
    //int llen=4*5;
    for(int i=0;i<intlength;++i)
    {
        printf(" %d\t",*(*arry+i));
    }
    printf("\n");
  
}
  
/**
 * @brief   可以
 *
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay3(int** arry,int row,int col)
{
    //在main 中直接使用可以
    printf("\n10 指针遍历二维数组\n");
    int *ddpp;//=*arry;
    for(int i=0;i<row;++i)
    {
        ddpp=*(arry+i);
        for (int j = 0; j < (col-1); j++) {
            printf(" %d ",*(ddpp+j));
        }
        printf("\n");
    }
    printf("\n");
}
/**
 * @brief       Ok
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay4(int** arry,int row,int col)
{
  
    printf("\n11 指针遍历二维数组\n");
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            printf("%d ", arry[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
/**
 * @brief    ok  
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay6(int** arry,int row,int col)
{
  
    printf("\n13 指针遍历二维数组\n");
    for (int i = 0; i < row; i++) {
        //printf("Address of %d th array %u \n",i , *(arry + i));
        for (int j = 0; j < col; j++) {
            printf("%d ", *( *(arry + i) + j));
        }
        printf("\n");
    }
    printf("\n");
}
/**
 * @brief    OK  
 * @param arry 二维数组
 * @param row 行长度
 * @param col 列长度
 * @return int
 */
int pointDisplay5(int*** arry,int row,int col)
{
  
    printf("\n12 指针遍历二维数组\n");
    for (int i = 0; i <row; i++) {
 
        for (int j = 0; j <col; j++)
        {
            printf("%d ", *arry[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
 
/**
 * @brief  释放所有堆内存    
 * @param ps
 * @param n
 *
 */
void freeMemoryChar(char **ps,size_t n)
{
    for(size_t i=0;i<n;n++)
    {
        free(ps[i]);
        ps[i]=NULL;
    }
    free(ps);
    ps=NULL;
}
 
/**
 * @brief   释放所有堆内存   
 * @param ps
 * @param n
 *
 */
void freeMemoryInt(int **ps,size_t n)
{
    for(size_t i=0;i<n;n++)
    {
        free(ps[i]);
        ps[i]=NULL;
    }
    free(ps);
    ps=NULL;
}

调用:

int main()
{
 
    printf("hello c world \n");
    printf("你好,中国\n");
 
     
   // stringInputSort();
 
    int arrdu[5][4]={
        {10,20,30,40},
        {50,60,70,80},
        {90,100,110,120},
        {130,140,150,160},
        {170,180,190,200}       
    };
    // 4 列
    int dum=4;
    //5 行
    int dun=5;
     
 
     for(int i = 0; i <dun ; i++)
    {
        for (int j = 0; j < dum; j++) {
            printf("%d ", arrdu[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");
    for(int i = 0; i <dun ; i++)
    {
        printf("Address of %d th array %u \n",i , *(arrdu + i));
        for(int j = 0; j <dum ; j++)
        {
             printf("arr[%d][%d]=%d\n", i, j, *( *(arrdu + i) + j) );
        }
        printf("\n\n");
    }
 
 
    int* ptr = malloc((dum * dun) * sizeof(int));
    /* Putting 1 to 12 in the 1D array in a sequence */
    for (int i = 0; i < dun * dum; i++)
        ptr[i] = i + 1;
 
     
 
    //int** pe;
    //pe=arrdu;
    /**/
    //分配内存
    int** pe = (int**)malloc(sizeof(int)*dum);
    for(int i=0; i<dun; i++)
    {
        pe[i] = (int*)malloc(sizeof(int)*dum);
    }
 
    //初始化内存
    //memset(*pe, 0, sizeof(int)*dum*dun);
 
    //2分配内存
    int*** arr2 = malloc(dum * sizeof(int**));
        for (int i = 0; i < dun; i++)
            arr2[i] = malloc(dun * sizeof(int*));
     
    // Initialising each element of the
    // pointer array with the address of
    // element present in the other array
    for (int i = 0; i <dun; i++) {
            for (int j = 0; j <dum ; j++) {
                arr2[i][j] = &arrdu[i][j];
            }
    }
    printf("The values are\n");
    for (int i = 0; i <dun ; i++) {
        for (int j = 0; j <dum ; j++) {
            printf("%d ", *arr2[i][j]);
        }
        printf("\n");
    }
      
    //strcpy(pe,arrdu);
    for (int i = 0; i <dun ; i++)
    {
        for (int j = 0; j <dum ; j++)
        {
            pe[i][j]= arrdu[i][j];
            //ptr[i][j]=arrdu[i][j];
            //strcpy(pe[i][j],arrdu[i][j]);
            printf("%d\n",arrdu[i][j]);
        }          
 
    }
    printf("PE The values are\n");
    for (int i = 0; i < dun; i++) {
        for (int j = 0; j <dum ; j++) {
            printf("%d ", pe[i][j]);
        }
        printf("\n");
    }
 
    pointDisplay0(arrdu,dun,dum); //ok
    pointDisplay4(pe,dun,dum); //ok
    pointDisplay5(arr2,dun,dum); //ok
    pointDisplay6(pe,dun,dum); //ok
    pointDisplay2(arrdu,dum*dun); //ok
    pointDisplay3(pe,dun,dum);
    pointDisplay(pe,dun,dum);  //12
    pointDisplay1(pe,dun,dum);  //12
 
    //释放资源
    free(pe);
    free(arr2);
    pe=NULL;
    arr2=NULL;
    system("pause");// linux 无效 ,只win 下有效
    return 0;
 
}

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1150762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题是由安全生产模拟考试一点通提供&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材&#xff0c;N1叉车司机大纲整理而成&#xff08;含2023年…

生产级 React 框架介绍

文章目录 生产级 React 框架生产级 React 框架Next.jsRemixGatsbyExpo 如何选择生产级 React 框架 生产级 React 框架 React 是一个流行的 JavaScript 框架&#xff0c;用于构建用户界面。React 框架可以帮助你快速构建高质量的 React 应用&#xff0c;但并不是所有的 React 框…

Linux下GPIO和看门狗应用编程

文章目录 GPIO应用编程看门狗应用编程 GPIO应用编程 应用层操控硬件可以通过操作这些硬件的设备文件来进行&#xff0c;设备文件是各种硬件设备向应用层提供的一个接口&#xff0c;应用层通过对设备文件的I/O操作来操控硬件设备。设备文件通常在/dev/目录下&#xff0c;该目录…

react:生命周期

一、生命周期阶段 官方文档&#xff1a;https://zh-hans.legacy.reactjs.org/docs/react-component.html React组件生命周期可分为三个阶段&#xff1a;挂载、更新、卸载 挂载&#xff1a;当组件实例被创建并插入 DOM 中时。其生命周期调用顺序如下&#xff1a; constructor()s…

rfsoc FPGA 49DR 16收16发模块

前面简单介绍过RFSOC板卡 https://blog.csdn.net/jingjiankai5228/article/details/114734631 整体来说RFSOC降低了传统AD DA软硬件开发难度&#xff0c;但是同样存在整数点FS/N谐波大的问题 交织采样是通过多个AD拼接完成的&#xff0c;所以校准比较关键&#xff0c;和以前常…

【算法练习Day33】不同路径不同路径 II

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 不同路径不同路径 II总结&a…

腾讯云轻量服务器“镜像类型”以及“镜像”选择方法

腾讯云轻量应用服务器镜像类型分为应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像&#xff0c;腾讯云百科txybk.com来详细说下不同镜像类型说明和详细介绍&#xff1a; 轻量应用服务器镜像类型说明 腾讯云轻量应用服务器 应用镜像&#xff1a;独有的应用镜像除了包…

RHCE---作业4

一.批量创建账户 .编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用广输入&#xff0c;例如: test1、test2、test3、.....、 test10 read -p "请输入账户前缀名&#xff1a;" user read -p "请输入…

低代码软件在酒店行业的应用:提升效率与创新!

疫情放开后&#xff0c;旅游业开始兴盛发展&#xff0c;酒店行业也恢复了疫情前的繁忙。但是由于管理架构上的不完善导致很多酒店并不能很好地承接巨大的客流量&#xff0c;而消费者在旅游过程对体验要求是最高的&#xff0c;所以酒店拥有一个能够高效运营的管理系统至关重要。…

前端接口请求支持内容缓存和过期时间

前端接口请求支持内容缓存和过期时间 支持用户自定义缓存时间&#xff0c;在规则时间内读取缓存内容&#xff0c;超出时间后重新请求接口 首先封装一下 axios&#xff0c;这一步可做可不做。但是在实际开发场景中都会对 axios 做二次封装&#xff0c;我们在二次封装的 axios …

Redis入门指南学习笔记(1):初识Redis

一.什么是Redis? Redis全称为Remote Dictionary Server&#xff0c;即远程字典服务器&#xff0c;它采用字典结构来存储数据&#xff0c;并允许其他应用通过TCP协议来访问数据。 字典在众多开发语言中都很常见&#xff0c;其形式为键值对&#xff0c;根据键可以获取相应的值…

文件名替换,关键字替换改名:不同路径中的多个文件如何批量重命名

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;包括重命名、分类、整理等操作。其中&#xff0c;批量重命名不同路径中的多个文件是一项非常常见的任务。本文将介绍云炫文件管理器常见的批量重命名方法&#xff1a;文件名关键字替换改名&#xff0c;帮…

python类模拟“对战游戏”

Game类含玩家昵称、生命值、攻击力(整数)&#xff0c;暴击率、闪避率(小数)&#xff0c;在魔术方法init定义&#xff1b;attack方法中实现两个Game实例对战模拟。 (本笔记适合初通Python类class的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.py…

请输入正确的小程序的链接,并确保小程序允许被搜索

公众号文章插入小程序时提示“请输入正确的小程序的链接&#xff0c;并确保小程序允许被搜索”&#xff1a; 这是因为你输入的是小程序路径&#xff0c;不是小程序链接。 如果是你想使用小程序路径&#xff0c;需要点击第一张图中的蓝色字“去搜索”&#xff0c;然后搜索选择你…

少儿编程 2023年9月中国电子学会图形化编程等级考试Scratch编程四级真题解析(判断题)

2023年9月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 11、运行程序后,变量"result"的值是6 答案:对 考点分析:考查积木综合使用,重点考查自定义积木的使用 图中自定义积木实现的功能是获取两个数中最大的那个数并存放在result变量中,左…

Find My水杯|苹果Find My技术与水杯结合,智能防丢,全球定位

2018年中国智能水杯行业的市场规模约为32亿元&#xff0c;而到2021年&#xff0c;这一市场规模将达到45亿元&#xff0c;增长率约为8.6%。随着智能科技的不断深入发展&#xff0c;智能水杯也越来越受到消费者的青睐&#xff0c;他们更加偏爱智能水杯带来的便捷。智能水杯可以监…

Webpack5中devServer配置contentBase报错的问题

结果报错&#xff0c;没有contentBase这个属性&#xff0c;已经被弃用了。 新的配置方式&#xff1a; const path require(path);module.exports {//...devServer: {static: {directory: path.join(__dirname, public),},compress: true,port: 9000,}, };

关于Spring和SpringBoot中对配置文件的读取

Spring读取xml文件 具体流程见网址Spring源码分析2 — spring XML配置文件的解析流程 - 知乎 (zhihu.com) 我这里只做一下总结和自己的理解&#xff1a; &#xff08;1&#xff09;通过getConfigLocations方法, 从web.xml文件中读取配置文件地址&#xff0c;如果web.xml中读取…

ES 8.x新特性一览(完整版)

一、看点 在 2022 年 2 月 11 日&#xff0c;Elasticsearch&#xff08;ES&#xff09;正式发布了 8.0 版本&#xff0c;而截止到 2023 年 10 月&#xff0c;历经一年半时间&#xff0c;ES官方已经连续发布了多个版本&#xff0c;最新版本为 8.10.4。这一系列的更新引入了众多引…