目录
Hello everbody!在这一篇文章中,我打算和大家聊一聊c语言的指针。指针可以说是c语言的灵魂,指针的重要性想必无需我多言。而指针的种类繁多,特别是数组指针,指针数组,函数指针,函数指针数组,指向函数指针数组的指针,数组名,取地址数组名等等都属于指针的范畴。它们的类型,声明都相对复杂。这是c语言中最隐晦,最难啃的骨头。对于c初学者来说难度较大。当然,只通过一篇文章想把这些东西全部给大家讲清楚显然不太可能。所以今天我先和大家聊一聊数组名和取地址数组名。在接下来的几篇文章中,我会陆续把c语言所有的指针全部给大家讲清楚。届时,欢迎各位捧场!
1.sizeof(数组名),sizeof(取地址数组名)
这是一组结构十分相似的题目,也是曾经公司招聘的面试题目。大家可以自己先做一做,看看能做对几道。可以把自己的答案写在评论区下。如果能做全对的话,说明你对指针的理解已经十分深入了呦!
首先我们要明确的一点是:一个数组的数组名就是该数组首元素的地址!
但是有两个例外:1.sizeof(数组名).这里的数组名表示的是整个数组。sizeof(数组名)计算的是整个数组的大小,单位是字节。
2.&数组名,这里的数组名表示整个数组,&数组名取出的是数组的地址。
1.2 &数组名与数组名的异同:
1.相同点:它们的值相同,大小都等于该数组首元素的地址。
2.不同点:类型不同,访问权限不同。如果这是一个有十个元素的整型数组,那么数组名就是整型指针,只能访问4个字节。&数组名就是数组指针,能够访问整个数组大小的字节,对于有十个元素的整型数组,就能都访问40个字节。再讲清楚一点就是:数组名+1,指针就从第一个元素跳到了下一个元素。&数组名+1,指针就从数组的起始位置跳过了一整个数组。
为了让大家更直观的理解它们,我编写了一个能够以16进制打印地址的程序。
在该程序中,我们可以清晰的看到:arr与&arr大小相同,大小均为0x62FDF0。arr+1大小为0x62FDF4,跳过了4个字节。&arr+1大小为0x62FE18,跳过了40个字节。
2.题目讲解
2.1整型数组
我把&数组名和数组名单独列一个标题也说明了它们的重要性。搞清楚了上面所讲的东西,理解下题就会相对容易一些。
1.sizeof(数组名),计算数组的大小,单位字节。答案是16
2.这里数组名没有单独放在sizeof中,所以这里的数组名代表首元素地址,而地址的大小在32位平台下是4个字节,在64位平台下是8个字节,所以本题的答案是4/8
3.数组名表示首元素地址,*数组名表示首元素。这里计算的是首元素的大小,而整型元素不论在32位平台下还是在64位平台下大小都是4个字节。所以答案是4
4.数组名+1,指针从首元素跳转到第二个元素。但计算的依然是地址的大小。答案是4/8
5.a[1]访问的是数组第二个元素,这里计算的是第二个元素的大小。答案是4
6.&数组名取出的是数组的地址。虽然是数组的地址,但不管怎么说,它都是地址,地址的大小都是4或8个字节。数组的地址唯一与众不同的地方只是它的访问权限大一些,仅此而已,大家可千万不要搞混了呀!答案是4/8
7.取地址数组名取出的是整个数组的地址,再解引用得到整个数组。也可以这样理解:取地址和解引用抵消了,相当于sizeof(数组名) 答案是16
8.&数组名+1,指针跳过整个数组,但这个表达式依然是地址,sizeof计算的依然是地址的大小。答案是4/8
9.数组下标运算符【】的优先级高于取地址操作符&。所以这里是先访问首元素再取地址。解释方式同上。答案是4/8
10.&a[0]表示首元素地址,&a[0]+1表示第二个元素的地址。答案是4/8
2.2字符数组
1.sizeof(数组名) 计算数组的大小 单位字节 答案是6
2.数组名没有单独放在sizeof中,数组名代表首元素地址,只要是地址,大小就是4或8个字节。大家不要把字符指针看扁了呀! 答案是4/8
3.*arr代表首元素,计算首元素的大小 答案是1
4.解释同上 答案是1
5.&数组名,取出了整个数组的地址,该指针的访问权限有6个字节,但仍然是地址。 答案是4/8
6.&arr+1,跳过了整个数组,但仍然是地址 答案是4/8
7.&arr[0]+1,跳过了首元素,但仍然是地址 答案是4/8
3.结语
好啦,今天的话题就讲到这里喽!大家是否有收获呢?我相信,认真看过这篇文章的你们一定是收获满满!
上天一定会眷顾那些努力提升自己的人,所以大家每天都要坚持敲代码丫,我就在每天坚持敲代码呦!看谁卷得过谁,哈哈哈\(0^◇^0)/