硕彦博创学习记录——2018.7.24(指针——指向二维数组、结构体,指针数组)

指针数组:专门用来存放指针的数组

类型* 数组名[长度]

指针数组也是数组,它是用来存放指针的,或者说地址。在上图中,buf+i表示的是第i+1个指针在内存中的地址,buf[i]则是第i+1个指针中存放的内容,比如说buf[0]中存放的是&a,是变量a在内存中的地址,buf[0]=&a.  *buf[0]=100,是输出变量a的值。

二维数组与指针:

从上图可以看到,buf1、buf1[0]、&buf[0][0]、*(buf1+0)在数值是上相等的,但是它们的意义并不相同。

buf1是数组名,是整个二维数组的首地址,buf1[0]是第一行的首地址,&buf[0][0]则是第一行第一列元素的地址,*(buf1+0)是bu1[0]的另一种写法,它的意思也是第一行的首地址。在后面的程序中我们看到的*buf都是*(buf+0),只是将0和括号省略了,并不是数组名。

引用元素的内容:

从上图可以看到,表示第三行第三列元素的几种方法:

buf1[2][2]这是数组的下标法

*(buf1[2]+2)是下标法和指针法结合,buf[2]指的是第三行的首地址,+2则是向后移动2个元素,指向第三个元素的地址,*取地址的内容

(*(buf1+2))[2]这也是下标法和指针法结合,*(buf1+2)指的是第三行的首地址,[2]是第三个元素,用这个方法是一定要注意括号,由于优先级的问题,若写成*(buf1+2)[2]则错误。

指向二维数组的指针变量:

类型 (*指针变量)[列]

在定义指向二维数组的指针变量时,一定要注意括号,若去掉括号就是指针数组,这一点要注意。

图中的几种引用元素的写法没什么争议的。接着讲一下少括号的问题,这个上面已经讲过一部分,但是没有展示结果

可以看到(*(buf+1))[1]的值为6,而*(buf+1)[1]的值为9,它实质上指的是*(buf+1+1)=*(buf+2),指向第三行的首地址,而*则取出此地址的内容,也就是第三行第一列元素的值,为9。如果*(buf+1)[3]这时,它就指向第五行的首地址,但是此二维数组是没有第五行的,也就是说它指向一个不可预测的地址,应避免这种情况。

结构体指针变量:

struct 类型* 变量名

引用成员:

结构体变量名.成员

指针->成员

(*指针)->成员

通过实验可以知道,ps=&ywx=&ywx.id,因此*ps的值就是ywx.id的值

结构体指针数组和二维结构体数组:

这一部分和指向二维数组的指针没有上面区别,就不多阐述了。

 

猜你喜欢

转载自blog.csdn.net/yangwenxiao123456/article/details/81193488
今日推荐