C语言:指针的数组与数组的指针

今天做计算机二级c语言的一道题是这样的:
下列语句中存在语法错误的是 a
a char ss[6][20];ss[1]=“right?”;
b char ss[] [20]={“right?”};
c char *ss[6];ss[1]=“right?”;
d char ss[]={“right?”};
我就做错了,然后一查答案,有点懵逼,于是我秉承着一问到底的态度一路追查了下去,终于把真相揭开了,在网上发现了位大神写的博客这是连接:
https://www.cnblogs.com/mq0036/p/3382732.html
看完之后真是收益匪浅啊!

我就写写我理解的,就当作给这一天一个交代,梳理下知识了。
就拿这道题来说:

char ss[6][20]叫做:ss是指向char类型的数组(元素个数为20)的数组(元素为6)
char(*ss)[20]叫做:ss是指向char类型的数组(元素个数为20)的指针——即数组的指针
char ss[][20]
这三种写法是一样的
那么就可以说 数组的数组 可以叫做数组的指针

char *ss[6];叫做:ss是指向char类型的指针的数组(元素个数为6)——即指针的数组

这是怎么分开的,依据什么分开的呢?依据来了:
()的优先级大于[]的优先级大于*
即 ()>[]>*
所以就区分出了这两个恶魔

下面来梳理下 ——数组的指针(又叫行指针)
char(*ss)[20]——数组的指针,着重的是指针;
叫法是:ss是指向char类型的数组(元素个数为20)的指针;
经过我分析,既然是数组的指针,那么就代表着这个数组是一个指针。(这里不得不感叹中华文化博大精深啊,语文不好很吃力)
整个数组ss是一个指针。如下图,我只画了一个,像这样的一共是有六个的
在这里插入图片描述
ss+1;就是ss[0]加1变成ss[1];
如果是int a[2][3];a++;那么就是a从a[0][0]变到a[1][0],走了三个格子
在上一篇以及我的所有文章当中,都把数组叫做箱子,把派生出来的数组叫做箱子中的小隔间。
现在知道了,char ss[6][20]=char(*ss)[20]的意思
那么内存图里指针ss指向首地址ss[0],这个ss[0]是它里面的内存单元的地址,也就是门牌号。在ss[0]这个门牌号里面住着ss[0]这个常量。
所以
你把“right?”这个字符串常量赋给ss[0]这个常量是不对的,常量不能赋给常量;

现在再梳理下——指针数组
首先指针数组着重于数组,讲究的是数组里面每个元素都是指针;
char *ss[6] 叫做:ss是指向char类型的指针的数组(元素个数为6)
它的内存图如下:

在这里插入图片描述
里面全都是指针

这里面的ss只是名字而已
里面包含了6个指针
而每一个指针又指向一个地址
每一个地址又有它自身所属的地址单元
所以,ss[1]是一个指针
“right?”是一个字符串常量,而字符串常量的类型是char的数组, 在表达式中,它又可以解读成指针。

介绍一下基本表达式:
基本表达式是指:
1 标识符(变量名,函数名)
2常量(包括整数常量和浮点常量)
3 字符串常量(使用“”括起来的字符串)
4 使用()括起来的表达式
也就是说,“5”,“hoge”都是表达式,“hoge+5”也是表达式

回归正题 既然两个都是指针就可以相互赋值
所以char *ss[6];ss[1]="start?"是对的。

扫描二维码关注公众号,回复: 9167217 查看本文章

数组真的是很厉害,我这一天的功夫全用在研究你身上了,拜倒在你的石榴裙下。。。。。

发布了32 篇原创文章 · 获赞 7 · 访问量 4026

猜你喜欢

转载自blog.csdn.net/qq_43026792/article/details/86576659