【【C语言学习探讨】第二十三章、C语言之指针4】https://toutiao.com/group/6673445675096605188/?app=explore_article×tamp=1554127717&group_id=6673445675096605188&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share
这一章我们来看看指针和多维数组有什么关系,我们先用一个二维数组来了解一下。
假设有一个二维整形数组int a[4][2];
这个二维数组,看过前几章的应该可以知道数组名a同时也是数组首元素的地址,像这个二维数组a的首元素本身又是包含两个int的数组,因此a也是包含两个int的数组地址,
我们通过一段程序来看一下:
我们来分析一下:
1. 因为a是数组首元素的地址,所有a的值和&a[0]的值相同,另一方面,a[0]本身是包含了两个整数的数组看第一张图,因此呢a[0]的值同其首元素的地址&a[0][0]相同,简单的说就是,a[0]是一个整数大小对象的地址,而a是两个整数大小对象的地址,但是他们开始于同一个地址,所以a和a[0]具有相同的值。
2. 对一个指针加一,会对原来的数值加上一个对应类型大小的数值。在这方面a和a[0]是不一样的,a所指向的大小是两个int,而a[0]所指向对象的大小是一个int,因此a 1和a[0] 1结果不同。
3. 对一个指针取值(使用*运算符或者带有索引的[]运算符),得到的是该指针所指向对象的数值。因为a[0]是其首元素a[0][0]的地址,所以*(a[0])代表存储在a[0][0]中的数值,即一个int数值,同样的*a代表其首元素a[0]的值,但是a[0]本身就是一个int数的地址,即&a[0][0],因此*a是&a[0][0]。简而言之,a是地址的地址,需要两次取值。
总结一下:
上面可能看的云里雾里,那我在用一幅图解释下:
不知道大家了解了没有,来个题目吧,好久没有做题目了,大家可以评论区回答下,加深一下印象:
下面这段代码对打印出什么?