首页 > 系统相关 >(Linux)嵌入式打卡第十一天

(Linux)嵌入式打卡第十一天

时间:2024-09-14 21:20:29浏览次数:3  
标签:第十一天 arr str int printf 数组 Linux 打卡 指针

指针数组

简介

概念:
    指针数组的本质是一个数组,只不过数组里面的每一个元素都是指针;
定义格式:
    数组类型 *数组名[成员个数];
    eg:
        //定义一个数组,数组里面的每一个元素都是 int * 类型
        int *arr[5];

指针数组使用

#include <stdio.h>

int main(int argc, const char *argv[])
{
	//定义三个变量
	int value1 = 10;
	int value2 = 20;
	int value3 = 30;

	//定义一个数组,数组里面存放这三个变量的地址
	int *arr[3] = {&value1,&value2,&value3};

	//通过指针数组访问到value1,value2,value3里面的值
	
	for(int i = 0;i < 3; i++)
	{
		printf("*(arr[%d]) = %d\n",i,*arr[i]);
	}

	//指针配合字符串书写
	char *str_arr[5];//指针数组,数组里面每一个元素都是char *类型

	str_arr[0] = "hello world";//将readonly端存储的"hello world"的首地址
							   //给str_arr[0]的位置上
	str_arr[1] = "hello python";
	str_arr[2] = "hello java";
	str_arr[3] = "hello c++";
	str_arr[4] = "hello PHP";

	//使用for循环遍历字符数组
	for(int i = 0; i < 5; i++)
	{
		printf("arr[%d] = %s\n",i,str_arr[i]);
	}
	puts("--------------------------------");
	
	//定义数组的时候同时初始化
	//str_arr1的一个数组,数组里面的每一个元素都是char * 类型
	//str_arr1[0]的值是readonly段的hello字符串 h 的地址
	char *str_arr1[5] = {"hello","python","c/c++","php","java"};

	//使用for循环遍历字符数组
	for(int i = 0; i < 5; i++)
	{
		printf("arr1[%d] = %s\n",i,str_arr1[i]);
	}

	//二维数组
	char str_arr2[5][10] = {"hello","python","c/c++","php","java"};
	//定义一个二维数组str_arr2二维数组在内存的栈中
	//str_arr2[0][0] = 'h';
	
	for(int i = 0;i < 5;i++)
	{
		printf("str_arr2[%d] = %s\n",i,&(str_arr2[i][0]));
	}


	return 0;
}
结果:
*(arr[1]) = 20
*(arr[2]) = 30
arr[0] = hello world
arr[1] = hello python
arr[2] = hello java
arr[3] = hello c++
arr[4] = hello PHP
--------------------------------
arr1[0] = hello
arr1[1] = python
arr1[2] = c/c++
arr1[3] = php
arr1[4] = java
str_arr2[0] = hello
str_arr2[1] = python
str_arr2[2] = c/c++
str_arr2[3] = php
str_arr2[4] = java

格式化输出 %s

%s 输出的是需要一个地址的,拿出地址里面的值,打印出来,判断是不是\0,
    是\0的就停止,不是\0的会继续打印,直到遇见\0为止。

main函数传递参数

简介:
    C语言中,main函数是C语言的入口函数;main函数本身也是一个函数,函数就会有参数。
main函数的参数:argc,argv;
    argc:指针数组argv里面的元素的个数。
    argv:指针数组存放的是命令形参数每一个字符串的首地址
main函数传参:
    main函数是支持命令行 进行参数传递的。
    格式:
        ./可行性文件 参数1 参数2 参数3 ...

命令行 传递参数 原理

课堂代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
	//argc和argv就是c语言的main函数的参数。
	//打印参数 argc;
	
	printf("argc = %d\n",argc);

	//argv类型:指针数组,数组里面存放的每一个元素都是char * 类型
	
	for(int i = 0; i < argc ; i++)
	{
		printf("argv[%d] = %s\n",i,argv[i]);
	}


	return 0;
}
使用命令行传递参数:./a.out 123 138; 将其转化为数字类型;(使用atoi函数)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	//获取到指针数组里面每个元素的值
	for(int i = 1; i < argc; i++)
	{
		printf("argv[%d] = %d\n",i,atoi(argv[i]));
	}

	return 0;
}

数组指针

简介

概念:
    数组指针本质上是一个指针,这个指针指向的是一个数组;
数组指针定义个数:
    数据类型 (*变量名)[成员个数];
eg:
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int (*p)[10] = &arr;//arr在 &运算符的时候表达的是整个数组

课堂代码

#include <stdio.h>

int main(int argc, const char *argv[])
{
	//定义一个数组
	int arr[5] = {1,2,3,4,5};

	//定义一个指针,保存整个数组的地址
	int (*p)[5] = &arr;

	//问:指针p的类型是什么?
	printf("p = %p, p+1 = %p\n",p,p+1);//移动了整个数组的大小
	//指针p的类型是 int[5]数组类型的指针
	
	//p是整个数组的地址;通过p指针变量数组
	//*(整个数组的地址) == 变量名 数组名 ->  (*p)[0]
	for(int i = 0; i < 5; i++)
	{
		printf("arr[%d] = %d\n",i,(*p)[i]);
	}


	return 0;
}
结果:
p = 0x7ffd05b42990, p+1 = 0x7ffd05b429a4
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5

数组指针与二维数组

二维数组:

二维数组本质上也是一个一维数组;这个一维数组里面每个元素都是一个一维数组;

eg:

int arr[2][5];

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int arr[2][5] = {{1,2,3,4,5},
				     {6,7,8,9,10}};
	//数组名是数组的首元素的地址;二维数组的首元素,是一个一维数组
	//arr 这个二维数组的数组名就是 一维数组{1,2,3,4,5}的地址;
	
	int (*p)[5] = arr;//定义一个指针,指针去指向二维数组的首元素
	//在二维数组 p+1移动一行,所以数组指针又称之为 行指针
	
	printf("p = %p; p+1 = %p\n",p,p+1);
	printf("&arr[0][0] = %p; &arr[1][0] = %p\n",&arr[0][0],&arr[1][0]);

	//通过数组指针遍历二维数组
	for(int i = 0;i < 2;i++)
	{
		for(int j = 0; j < 5; j++)
		{
			//printf("%d ",(*(p + i))[j]);
			//printf("%d ",*(p[i]+j));
			//printf("%d ",*(*(p+i)+j));
			printf("%d ",p[i][j]);
		}
		putchar(10);
	}

	return 0;
}
结果:
p = 0x7ffdde86d350; p+1 = 0x7ffdde86d364
&arr[0][0] = 0x7ffdde86d350; &arr[1][0] = 0x7ffdde86d364
1 2 3 4 5 
6 7 8 9 10 

课堂练习

要求:定义一个数组:函数的功能 遍历一个二维数组

//完成这个show函数
void show(int (*p)[3],int line,int col)
{
    for(int i = 0; i < line; i++)
    {
        for(int j = 0; j < col; j++)
        {
            printf("%d ",(*(p + i))[j]);
        }
    }
}
int main()
{
    int arr[2][3] = {{1,2,3},{4,5,6}};
    show(arr,2,3);
}

数组名 +或- 移动字节数

简介

*:标识的是降维;

&:标识的是升维;

数组元素的首元素地址:

*数组的首元素地址 = 数组首元素的值;

&数组的首元素地址 = 整个数组的地址;

一维数组

二维数组

二级指针

简介

概念:

一级指针也是一个变量,定义在内存中,一级指针就会有一个地址。

保存一级指针的地址的指针,就称之为二级指针;

定义个数:

<数据类型> **指针名 = value;

课堂代码

#include <stdio.h>

int main(int argc, const char *argv[])
{
	//定义一个变量
	int number = 10;

	//定义一个一级指针
	int *p = &number;

	//定义一个指针,用来存放指针p的地址
	int **q = &p;

	return 0;
}

标签:第十一天,arr,str,int,printf,数组,Linux,打卡,指针
From: https://blog.csdn.net/2303_78438820/article/details/142067473

相关文章

  • Linux下载软件及卸载
    Linux发展史汤姆森·肯---UNIX之父斯托曼发起GNU计划莱纳斯linux之父现在主流的基于Linux的系统的发行版本centos、Ubuntu、Deepin(国产)、RedHat、...查看Ubuntu版本:cat/etc/issue查看内核版本:uname-a嵌入式层次结构一、用户空间命令脚本(命令的集合)app----......
  • linux 模拟题
    一,填空题linux主要是基于各种       来完成各种操作。打印当前所在的位置的命令是       linux的选项是哪两种        当前登录的用户tom,切换至用户家目录        想要使用命令本身的作用       ......
  • linux ln 命令
    ln是Linux系统中的一个命令,用于创建链接(link)或者链接一个目录。它主要有两种常见的用法:创建硬链接和符号链接(软链接)。1.创建硬链接:硬链接是在文件系统中创建一个文件的副本,它们共享相同的inode和数据块。当我们删除原始文件时,硬链接仍然会存在,并且可以继续访问文件的内容。创建......
  • Linux本地部署DbGate结合内网穿透工具实现无公网IP远程管理数据库
    文章目录前言1.安装Docker2.使用Docker拉取DbGate镜像3.创建并启动DbGate容器4.本地连接测试5.公网远程访问本地DbGate容器5.1内网穿透工具安装5.2创建远程连接公网地址5.3使用固定公网地址远程访问前言本文主要介绍如何在LinuxUbuntu系统中使用Docker部......
  • Linux 性能调优之CPU上下文切换
    写在前面博文内容为Linux性能指标CPU上下文切换认知内容涉及:上下文认知,发生上下文切换的场景有哪些上下文指标信息查看,内核上下文切换事件跟踪,系统上下文切换统计上下文异常场景分析,CPU亲和性配置优化上下文理解不足小伙伴帮忙指正......
  • 前端项目通过 Nginx 发布至 Linux,并通过 rewrite 配置访问后端接口
    〇、前言本文通过将arco框架的前端项目,部署至CentOS7,并访问同服务器的WebAPI接口,来简单演示一下,如何将前端项目发布至Linux系统。关于ASP.NETWebAPI发布至Linux的步骤,可以参考博主过往文章:https://www.cnblogs.com/hnzhengfy/p/18384107/webapi_centos。一、简......
  • Linux+Docker:3分钟实现MinIO在线部署与Java集成
    Linux下使用Docker安装MinIO1.拉取MinIO镜像dockerpullminio/minio2.创建挂载目录mkdir-p/opt/minio/datamkdir-p/optl/minio/config3.检查端口占用sudolsof-i:9000...4.启动MinIO容器dockerrun--nameminio\#容器名称-p9010:9000......
  • 记一次 公司.NET项目部署在Linux环境压测时 内存暴涨分析
    一:背景讲故事公司部署在某碟上的项目在9月份压测50并发时,发现某个容器线程、内存非正常的上涨,导致功能出现了异常无法使用。根据所学,自己分析了下线程和内存问题,分析时可以使用lldb或者windbg,但是个人比较倾向于界面化的windbg,所以最终使用windbg开干。二:WinDbg分析到底是......
  • 切换到淘宝最新 npm 镜像源的全面指南(支持 Windows、macOS 和多种 Linux 发行版)
    切换到淘宝最新npm镜像源的全面指南(支持Windows、macOS和多种Linux发行版)在开发过程中,npm是前端开发者不可或缺的工具。但对于国内的开发者来说,npm官方源在下载速度上存在一定的瓶颈。淘宝npm镜像源同步了官方库,并提供了更快的访问速度。本文将详细介绍如何在Wi......
  • linux base epel extras docker-ce-stable
    ‌base、epel、extras、updates和docker-ce-stable是Linux软件仓库的名称,用于管理软件包。‌‌base‌:这是CentOS或RHEL系统自带的软件仓库,包含了系统自带的软件包。‌epel‌:EPEL(ExtraPackagesforEnterpriseLinux)是一个为EnterpriseLinux(包括CentOS和RHEL)提供的免费、高......