C语言(八)
指针跟二维数组之间的关系
==========================
熟练掌握二维数组跟指针有关的几种写法
例子1:int类型的二维数组
int a\[5\]\[6\]=\{78,96,741,5,12,74\};
哪些是指针,如果是指针,请问是什么类型的指针?哪些不是
a a+1 是指针,表示该数组首元素(a\[0\])的地址&a\[0\],加了24个字节
a的类型是: int (\*)\[6\]; 数组指针
&a &a+1 是指针,数组名前面加上&表示指向整个数组的一个指针
整个数组 int \[5\]\[6\]这种类型
&a的类型是:int (\*)\[5\]\[6\]
a\[0\] a\[0\]+1 是指针,把二维数组当成特殊的一维数组看待,a\[0\]就是第一个成员的名字,第一个成员就是int\[6\],数组名出现在表达式表示该数组(int\[6\])首元素的地址
a\[0\]的类型是: 等价于&a\[0\]\[0\] int \*
&a\[0\] &a\[0\]+1 是指针
&a\[0\]的类型是: int (\*)\[6\]; 数组指针
a\[0\]\[1\] a\[0\]\[1\]+1 不是指针
&a\[0\]\[1\] &a\[0\]\[1\]+1 是指针, int \*
例子2:char类型的二维数组
char b\[5\]\[10\];
练习:
1. 自行验证char类型的二维数组,规律跟彭老师总结是不是一样的??
肯定是一样
2. char b\[5\]\[10\]=\{"hello", ''world", "gechehe","china"\};
//思路: b理解成5个 char \[10\]
//用字符c替换world中字符r
\*(b\[1\]+2)='c'; // b\[1\]是指针--》什么类型char \* 等价于 &b\[1\]\[0\]
//p是数组指针
char (\*p)\[10\]=&b\[2\]; // b\[2\]数组名,&b\[2\]是个数组指针
// p指向china
p++;
printf("p is:%s\\n",(char \*)p); // %s要求打印字符串,必须是char \*类型
printf("b\[1\] is:%s\\n",b\[1\]);
答疑:
问题一: \*(b\[1\]+2)='c' 和 b\[1\]+2='c',有啥区别?
b\[1\]+2='c' 语法错误
左边等价于 &b\[1\]\[0\]+2 -->是个指针
作业:
1. 定义一个char类型的二维数组char buf\[6\]\[20\],要求使用指针操作去除掉字符串中所有的非英文字母(只要不是英文字母的全部剔除)
思路有两种:第一种采用char \*指针去访问这个二维数组
第二种采用数组指针 char (\*p)\[20\] p\[i\]\[j\]
2. 定义一个char类型的二维数组char name\[5\]\[20\],你从键盘输入5个字符串表示5个人的名字,编程实现用指针判断5个名字中是否包含了英文大小写以及数字,并且每个人的名字长度不能超过8个字符(人的名字要求:小写字母,大写字母,数字字符三种都要包含),如果名字符合要求就打印出来,不符合就打印缺少了那种字符(缺少了小写?大写?英文?printf打印提示即可)
思路:用指针去遍历字符串,标记字符的类型(大写,小写,数字字符)
定义三个int类型的变量去标记
int flag1=0; // 1 大写 0 非大写
int flag2=0; 1 小写 0 非小写
int flag3=0; 1 数字字符 0 非数字字符
hfdhskfhE86 //只要有一个字符不符合三种类型要求,直接退出循环
还没有评论,来说两句吧...