​指针大小什么意思(指针是 C 语言的重要组成部分)

指针大小什么意思(指针是 C 语言的重要组成部分)

指针是 C 语言的重要组成部分,可以说是 C 语言的灵魂。所谓指针用得好,编程没烦恼。但是指针不太好掌握,我也是曾经被指针虐待千百遍,可我依然待她如初恋。在此我整理一下我对于指针的理解。

指针,是一个存放地址的变量

指针是一个单变量,存放着内存地址,她的大小是由计算机系统地址宽度所决定。简单来说,32位系统,指针的大小就是 4 Byte。64位系统,指针的大小就是 8 Byte。在同一系统中,所有类型的指针大小都一样。不管她是 void* 指针,char* 指针,还是函数指针,统统都是 4 或者 8 Byte。具体代码:

char* p1; int* p2; float* p3; double* p4; void* p5; printf("\n"); printf(" p1 指针的size: %d \n", sizeof(p1)); printf(" p2 指针的size: %d \n", sizeof(p2)); printf(" p3 指针的size: %d \n", sizeof(p3)); printf(" p4 指针的size: %d \n", sizeof(p4)); printf(" p5 指针的size: %d \n", sizeof(p5));

输出:

指针大小什么意思(指针是 C 语言的重要组成部分)

指针,是有形状的

这里的形状是指指针在内存操作的有效范围,这个就是指针的类型有关了。例如,char* 指针能操作 8 个 bit 的内存,而 int* 指针能操作 32 个 bit 的内存。举个形象一点的例子:有两个手电筒,一个口径是1,另一个口径是4,那么它照在墙上的光斑的大小和不一样。

指针大小什么意思(指针是 C 语言的重要组成部分)

具体代码:

// 此处 a 的内存分布为:// 00000001 00000001inta = 257; int*b = &a; char*c = &a; printf("\n"); printf(" b 指针的值: %p \n", b); printf(" c 指针的值: %p \n", c); printf(" *b 的值: %d \n", *b); printf(" *c 的值: %d \n", *c);

输出:

指针大小什么意思(指针是 C 语言的重要组成部分)

由上图所示,指针 b 与 c 的地址是一样的,但是 b 与 c 指针的有效内存访问范围不同,所以从同一内存地址中能拿到的内容也不一样。

指针的运动

上述所说,指针是变量。那么意味着指针可以做运算。但是指针只能做加减运算,不能做乘除运算。指针的加减运算,意味着指针值整体偏移,偏移的量的由定义这个指针的类型而决定:

当指针是指向单个变量时,他的偏移量就是,定义它的变量类型的大小

int*p;p=100;//p==0x100p++//p==0x104,sizeof(int)是4,所以偏移4。long*p1p1=100//p1==0x100p1++//p1==0x108,sizof(long)是8,所以偏移8。int*p2p2=100//p2==0x100p2+5//p2==0x100+4*5=0x120,偏移5个sizeof(int)。当指针指是一个数组指针,那么她的偏移量就有点复杂。她偏移量为该数组的最后一维度到数组第二维度的乘积,再乘以该指针的定义类型大小。举例子:一个三维 int 数组如下:

int arr[5][4][3];

那么指向 arr 的指针应该如下定义:

// 定义像个二维数组指针,其实是三维数组指针 int (*parr)[4][3]; parr = arr; printf(" parr 地址:%p \n,", parr); parr++ printf(" parr++ 地址:%p, 偏移量:%ld \n", parr, (long)parr-(long)arr);

输出:

指针大小什么意思(指针是 C 语言的重要组成部分)

由上图所示:偏移量为,最后一维3 * 第二维4 * sizeof(int) = 48。

令人厌烦的 ** 指针

char **p 这样定义的指针,就是双重指针,也就是指向指针的指针。双重指针主要的作用就是改变指针本身。也就是改变指针存放的地址值。例子:

printf(" \n "); char *a; a = 100; printf("a 的值: %d \n", a); char **p = &a; *p = 200; printf(" a 的值: %d \n", a); char *c = "ccc"; printf(" c 指向的字符串: %s \n", c); p = &c; *p = "bbb"; printf(" c 所指向的字符串: %s \n", c);

输出:

指针大小什么意思(指针是 C 语言的重要组成部分)

指针指向普通变量,是用于读写变量的值,指针指向指针,也是一样原理,用于读写指针里面的地址值。

相关推荐

​为什么管同事叫同学(同事称呼你为同学啥意思)

​为什么管同事叫同学(同事称呼你为同学啥意思)

115

为什么管同事叫同学(同事称呼你为同学啥意思) 千万别把同学还想成是年轻的时候,除非是私下里关系特别好,或者是与对方职务相当的,在同学聚会时候,能叫官职还是尽量叫官职,...

​身体乳怎么涂后背 洗澡后用身体乳效果最好

102

身体乳怎么涂后背 洗澡后用身体乳效果最好 身体乳是很多人都很喜欢使用的一种护肤产品,我们的护肤需要时刻补水,身体的肌肤也一样,身体乳是人人必备的护肤神器,身体乳涂后...

​结婚三年的老公,竟然是个同性恋

​结婚三年的老公,竟然是个同性恋

94

结婚三年的老公,竟然是个同性恋 外出培训结束,回家洗衣打扫的时候,我发现老公的袜子少了几只,沙发上有液体干了的痕迹。我随口问老公怎么回事,他突然慌乱,随后笑着说不知...

​淘宝网怎么维权投诉

​淘宝网怎么维权投诉

131

淘宝网怎么维权投诉 如果您在使用淘宝购物过程中与卖家出现纠纷,建议您第一时间联系卖家协商处理,如果与卖家协商无法达成一致意见,您来自可以通过发起维权来申请淘宝客服介...

​橘子皮怎么吃,牛不小心吃橘子皮会怎么样?

​橘子皮怎么吃,牛不小心吃橘子皮会怎么样?

114

橘子皮怎么吃,牛不小心吃橘子皮会怎么样? 牛不小心吃橘子皮会怎么样 橘子皮并不影响牛的消化系统,即使吃了也没关系。 吃的橘子皮放冰箱变成陈皮吗 吃了的橘子皮放冰箱,它是...

​17岁干点什么工作好,十七岁适合做什么工作

​17岁干点什么工作好,十七岁适合做什么工作

151

17岁干点什么工作好,十七岁适合做什么工作 提起17岁干点什么工作好,大家都知道,有人问17岁可以做什么工作,另外,还有人想问17岁适合做什么工作?,你知道这是怎么回事?其实...

​袁天罡称骨法对照表(袁天罡称骨法三两七钱)

​袁天罡称骨法对照表(袁天罡称骨法三两七钱)

125

袁天罡称骨法对照表(袁天罡称骨法三两七钱) 袁天罡称骨法对照表是一种古老而神秘的占卜 *** ,据说能够通过“骨骼”上的纹路和形状推断人的命运和性格。这种占卜方式源于唐代的...

​郁金香怎么醒花(盆栽郁金香花卉的养护技巧)

​郁金香怎么醒花(盆栽郁金香花卉的养护技巧)

91

郁金香怎么醒花(盆栽郁金香花卉的养护技巧) 如果你想要在春天欣赏到美观的郁金香,就要在秋天天气变凉爽后进行栽培,这样它经过寒冷的冬天进行适当的休眠,它的球茎里面就会...

​茅台浓香型白酒(类似茅台口感的白酒)

86

茅台浓香型白酒(类似茅台口感的白酒) 茅台浓香型白酒在国内市场的影响力越来越大,其产品价格也随之水涨船高。但是近日,泸州老窖发布公告称,公司旗下的泸州老窖特曲系列产品...

​螺蛳粉排行榜前十名(螺蛳粉排行榜十大品牌)

​螺蛳粉排行榜前十名(螺蛳粉排行榜十大品牌)

122

螺蛳粉排行榜前十名(螺蛳粉排行榜十大品牌) 螺蛳粉排行榜前十名。这个螺蛳粉是广西柳州的特色小吃,也是一种地方美食,在全国各地都有分布,但是最出名的还是广西柳州的螺蛳粉...

​当兵条件,当兵有什么条件嘛?

​当兵条件,当兵有什么条件嘛?

97

当兵条件,当兵有什么条件嘛? 当兵有什么条件嘛 应征入伍条件一、身体条件应征入伍的公民要身心健康、体魄强健。其中,有几项基本条件: (一)身高:男性162cm以上,女性160c...