嵌入式入门学习笔记,遇到的问题以及心得体会!
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)如下图演示:
指针数组(存二维数组中一维数组名)如下图演示
案例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,完成指针习题