嵌入式学习DAY8 --- 指针和二维数组,数组指针,指针数组

嵌入式入门学习笔记,遇到的问题以及心得体会!
day8

概述:
一,指针和二维数组
二,数组指针
三,指针数组

笔记

一、指针和二维数组

总结:
在二维数组中:arr[0][0]的类型是int ,而arr[0] = &arr[0][0],
所以arr[0]的类型是int *,又因为arr = &arr[0],
那么为什么arr的类型不是int **?

解释:
(1)因为arr+1移动了一个一维数组的大小,如果是int **,那么所指向类型是int *,因此加1应该移动4个字节,很明显不符合
(2)因为arr[i]是一个数组名,能够代表整个数组,所以加1应该移动一个数组的大小。

指针和二维数组图解如下:
指针和二维数组图解


二,数组指针
概念:指向一维数组的指针
本质:是一个指针,只不过该指针指向了一个一维数组

格式:
存储类型 数据类型 (* 指针变量名)[元素个数];

分析:
存储类型:该数组指针自身的存储类型
数据类型:该数组指针所指向一维数组中元素的类型

如何分析该数组指针自身的数据类型?
----》数据类型 (*)[元素个数]
如何分析该数组指针所指向的数据类型?
----》数据类型 [元素个数];

注意:因为中括号[]的优先级比星号*要高,所以为了表示当前定义的是一个指针,故加()来提升优先级

数组指针一维数组:
数组指针(一维数组)
数组指针(二维数组):
数组指针(二维数组)

案例1:
int arr[5] = {1,2,3,4,5};
定义一个数组指针,该指针指向一个含有5个整形元素的一维数组?
—》int (*p)[5] = &arr;

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int arr[5] = {0};
	//定义一个数组指针,指向含有5个int 类型的数组
	int (*p)[5] = &arr;

	printf("请输入:\n");
	int i;
	for(i=0;i<5;i++)
	{
		//scanf("%d",*p+i);
		scanf("%d",&(*p)[i]);
	}

	for(i=0;i<5;i++)
	{
		//printf("%d ",*(*p+i));
		printf("%d ",(*p)[i]);
	}
	printf("\n");
	return 0;
}

总结:
定义一个数组指针指向一个只含有一个一维数组时,没有意义,因为指针移动就不知道该指针指向哪里

指针的本质:操作一片连续的空间才有意义!!!

案例2:
int brr[2][3] = {1,2,3,4,5,6};
定义一个数组指针指向二维数组中第一个一维数组。
int (*p)[3] = &brr[0];
int (*p)[3] = brr;

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int arr[2][3] = {1,2,3,4,5,6};
	
	int i,j;
	for(i=0;i<2;i++)
	{
		for(j=0;j<3;j++)
		{
			//scanf("%d",arr[i]+j);
			scanf("%d",*(arr+i)+j);
		}
	}
	for(i=0;i<2;i++)
	{
		for(j=0;j<3;j++)
		{
			//printf("%d ",*(arr[i]+j));
			printf("%d ",*(*(arr+i)+j));
		}
		printf("\n");
	}
	return 0;
}


三,指针数组
概念:数组元素是指针类型的数组
本质:是一个数组,只不过该数组中的元素类型是指针类型

格式:
存储类型 数据类型 * 数组名 [元素个数];

分析:
存储类型:该数组中每个元素的存储类型
数据类型 * :数组中元素的数据类型

指针数组(&a,&b,&c)如下图演示:
指针数组(&a,&b,&c)
指针数组(存二维数组中一维数组名)如下图演示
指针数组(存二维数组中一维数组名)

案例3:
假设有三个int类型的变量
int a,b,c;
定义一个指针数组,用来存放这三个变量的地址:
int *p[3] = {&a,&b,&c};


char str[100] = {“wangjiajia”}; //在栈区开辟了100个字节的空间用来完全存储该字符串中的每一个字符
char *str = {“wangjiajia”}; //在栈区开辟4个字节的空间用来存储该字符串中的第一个字符的地址

char str[100];
str = “hahah”; //error —》因为str是数组名。而数组名代表首地址,就是一个常量,不能给常量赋值

char *str;
str = “hahah”; //OK —》给变量赋值天经地义!!!

char *str = “haha”; //初始化

定义一个指针数组,用来存储5个字符串的各自首地址
char *p[5] = {“wangjia”,“haha”,“xixi”,“gaga”,“hehe”};

int i;
for(i=0;i<5;i++)
{
puts(p[i]);
puts((p+i));
printf("%s\n",p[i]);
printf("%s\n",
(p+i));
}

#include <stdio.h>

#define M 5
int main(int argc, const char *argv[])
{
	char *pStr[M] = {"haha","wangjia","jjj","dilireba","Gaga"};

	int i;
	for(i=0;i<M;i++)
	{
		//puts(pStr[i]);
		printf("%s\n",pStr[i]);
	}
	return 0;
}


作业:
1,删除一个字符串中所有的空格

#include <stdio.h>


#define M 20
int main(int argc, const char *argv[])
{
	//删除字符串中的所有空格
	char str[M] = {'\0'};

	//定义一个字符指针变量。指向该字符串中的首地址
	char *p = str;

	printf("请输入一个字符串:\n");
	gets(p);

	//遍历字符串
	while(*p)
	{
		//判断该字符是否为空格
		if(' ' != *p)
		{
			p++;
		}
		else
		{
			//将空格之后的所有字符往前移动进行覆盖
			char *q = p;
			while(*q)
			{
				*q = *(q+1);
				q++;
			}
		}

	}

	printf("删除之后的为: %s\n",str);
	return 0;
}

2,完成指针习题

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值