(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值