鱼C论坛

 找回密码
 立即注册
查看: 1925|回复: 2

[技术交流] 【番杰的学习笔记】关于“指针”的那些事儿

[复制链接]
发表于 2021-9-30 17:15:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 番杰 于 2021-9-30 20:51 编辑

0.前言:
  最近为了回答几个小伙伴的问题,找了挺多的只指针的知识,在此记录一下,本人也是一位小萌新,若有帖子中出现错误,还请大家谅解,同时也请大家批评指出问题。
  另外:这个帖子,我会不定时的添加或修改一些内容的。

1.指针
以char *p  为例;
(1)指针p中存放的是地址,指向char类型数据的地址。
(2)指针p的大小是int类型(不同的编译器的int大小不同,本贴中的int类型大小均视为4字节),而不是char类型,char代表的是p指向的那个地址中的数据类型,
同时char也代表指针p的步长,即p每次移动的长度;
例如:指针p指向的地址为0,那么p+1则指向的地址是1。(步长为1个字节)
若使用int 定义指针p:int *p,
指针p指向的地址为0,那么p+1则指向的地址是4.(以int为4字节为例,此时步长为4字节)。

2.指针数组
以char *p[2] = {“Fan”,“Jie”}为例;
(1)指针数组,说白了,它还是一个数组,只不过它存储的是“指向char类型的指针”。
(2)p的大小:8字节,数组中存放了2个指针,一个指针的大小是4字节(int类型),2个当然是8字节啦!(不懂的小伙伴赶紧回去好好看看上面的“1.指针”)。
(3)取值:此时p[0]的取出值是“Fan”这个字符串的首地址,
而*p[0]则是对该地址进行解引用,取出该地址中存储的值,即 ‘F’。

3.数组指针
char array[2] = {'F','J'};
以char  (*p)[2] = &array为例;
(1)数组指针嘛,看名字就知道它是一个指针,一个指向数组的指针。
指针嘛,存储的一定是一个地址,指向啥就存放啥的地址,
p指向的是一个 ” char类型[2]个元素的数组 “,所以p中存储的就是 “char类型[2]个元素的数组的地址” 。
(2)p的大小:当让是4个字节啦(int类型),不管指针指向的是什么,它只要是指针,那么它的大小就是int类型(4字节)。
(3)p的步长:p指向数组,那么它的步长就是数组的大小,即2个char(2字节)。
例如:指针p指向的地址为0,那么p+1则指向的地址是2。(步长为2个字节)
若使用int 定义指针p:int (*p)[2],
指针p指向的地址为0,那么p+1则指向的地址是8.(2个int的大小,此时步长为8字节)。

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +6 收起 理由
guiding + 5 + 5 + 3 鱼C有你更精彩^_^
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-30 17:46:09 | 显示全部楼层
这个编译会报错
char  (*p)[2] = ['F','J']

改成这样吧
char  (*p)[2] = &(char [2]){'F', 'J'};

虽然这样也可以通过编译,但是有警告
char  (*p)[2] = {'F', 'J'};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-30 20:26:53 | 显示全部楼层

我本想写成这样的char  (*p)[2] = {'F', 'J'};,尴尬了。
感谢大佬提醒。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表