C语言之拿下指针(中)

目录

1.数组名的理解

2.使用指针访问数组

3.一维数组传参的本质

4.二级指针

5.指针数组

6.指针数组模拟二维数组


1.数组名的理解

当我们刚开始学习指针时学过用指针访问数组,有这样一段代码:

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0];

此时p中放的就是数组中首元素的地址,其实数组名就是数组首元素的地址,但是有两个例外:

1:sizeof(数组名)

2:&(数组名)

上面两种形式的数组名都表示整个数组,此外的数组名都表示数组首元素的地址。

那如何验证呢?如图:

此时上面三种情况的输出结果完全相同,那为什么说&arr取的是整个数组的地址跟其他的不一样呢?我们不妨将其都+1后移一位试一下:

如上图,我们发现直接&arr+1后移了40个字节,而不同于其他情况的4字节,这就是因为&arr中的数组名arr是表示整个数组的地址的。      

2.使用指针访问数组

一个式子: *(arr + i) <==>(等价于) arr[i] <==> *[i + arr] <==> i[arr]

能够使用指针访问数组的原因:数组在内存中是连续存放的

                                                   指针的元素可以很方便的遍历数组,取出数组内值

3.一维数组传参的本质

数组传参的本质:传递的是数组首元素的地址,所以形参即使写成数组的形式,本质上也是一个指针变量。

数组传参时:

形参可以写成数组

也可以写成指针

写成数组的形式最简单,在我们初学数组和函数时这样写可以方便我们理解,但是即使写成数组的形式,本质上还是指针。

4.二级指针

我们之前讲过,指针用来存放地址,但指针也是变量,变量就有地址,因此指针也有地址,那指针的地址是什么呢?由此我们引出了二级指针👇

我们先来看看二级指针的形式

由此可知,二级指针变量是用来存放一级指针变量的地址的

5.指针数组

存放指针的数组,每个元素其实是指针类型。

我们可以进行类比:

整型数组表示存放整型的数组

字符数组表示存放字符的数组

......

指针数组就表示存放指针的数组。

6.指针数组模拟二维数组

如图,可以通过指针数组模拟出二维数组的效果,但并非完全是二维数组,因为每一行并非是连续的。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言指针指针变量是两个不同的概念。指针是系统为每一个内存单元分配的地址值,它表示一个存储单元的地址。指针变量是存放指针的变量,它存放的是变量所占内存空间的首地址。指针变量可以通过解引用操作来获取存储单元的值,同时也可以通过自身的值来表示存储单元的地址。\[1\] 在定义指针变量时,类型对指针变量起两个作用。首先,类型可以决定存储单元的大小,这样指针变量就知道每次移动多少个字节。其次,类型也决定了指针变量的加1能力,即每次加1后指向的是下一个存储单元的地址。\[1\] 在C语言指针有不同的分类。普通指针是最常见的指针类型,它可以指向任意类型的数据。常性指针是指指针所指向的数据是常量,不能通过指针修改该数据的值。自身为常性的指针是指指针本身是常量,不能再指向其他地址。指向和自身都为常性的指针是指指针本身是常量,并且指向的数据也是常量。\[2\] 总结来说,指针是表示存储单元地址的值,而指针变量是存放指针的变量。指针可以通过解引用操作获取存储单元的值,同时也可以通过自身的值表示存储单元的地址。在C语言指针有不同的分类,包括普通指针、常性指针、自身为常性的指针和指向和自身都为常性的指针。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [C语言指针指针变量](https://blog.csdn.net/qq_48580892/article/details/116796846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C语言指针篇(一)指针指针变量](https://blog.csdn.net/weixin_30945039/article/details/97212538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值