详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], p[0] 的含义
解析:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 每一种表达式的含义
void main()
{int a = 1;char b = 'a';int* i = &a;//指向一个int值变量char* c = &b;//指向一个char值变量
}
从上面的程序中可以看出来,定义一个int类型的指针和char类型的指针,但它们的大小都是4byte,因为存放的是对应类型变量的地址而不是对应类型变量的内容。
二、指针P与指针P+1
void main()
{ int a[] = {1,2,3,4};int* b = (int*)&a;
}
在上面的程序中定义一个int类型的指针(在这里要重点强调一下,这里是int类型的指针,对后面的内容的理解很重要),指针b的地址为0x0018ff38,指针b+1的地址为0x008ff3c,他们中间相隔了4byte,刚好是一个int类型的大小,而指针b又是一个int类型的指针,所以我们可以得出一个结论:
指针P+1 = 指针P + sizeof(指针的类型) * 1
三、数组和指针(刚好看到上面程序结果想到的一个点)
在上面的运行结果中,我们可以发现a[1]和*(p+1)得到的值是一样的,因为&a[1]指向的地址和P+1指向的地址是一致。
在C语言中获得数组的值有两种方法:
第一种:匿名方法 --> a[1]
第二种:具名+匿名方法 --> P + sizeof(数组类型)*1
四、*(P+1)和*P+1的不同之处
void main()
{ int a[] = {1,4,3,4};int* p = (int*)&a;
}
其实这个问题很简单,因为*的优先级比+的优先级高,所以*P+1在编译器中是先取出p指向的int值然后加1,就是a[0]+1,也就是1+1,所以*p+1取出的值等于2。而*(P+1),因为多了一个括号,所以就变成指针P+1后,再取出里面的值,也就是a[1]的中的值,所以*(P+1)取出的值等于4。
五、*(P+1)和P[1]
也是用上面的程序,我直接上运行结果,一看就知道了
这大概是写法不同把,我个人的理解应该是跟上面第三点的两种取值方法原理相似。我做了以下的尝试
void main()
{ int a[] = {1,4,3,4};
}
可以正常运行,没有报错,这里就证明我的一个猜想,定义一个int类型的数组a,可以直接把a当做一个指向数组a首地址的int类型的指针使用。这就是说,定义一个int数组其实编译器内部开辟一个内存块和指向首地址int类型的指针给我们。
到这里,最后一个&P[0]的含义就很明显了,可以看成取数组第一元素的地址。
文章很多地址均为本人用例子尝试后得到的结论,可能不是很正确,如果您发现有错误的地方,请在评论中指出,以免误导其它人,本人不胜感激。
详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], p[0] 的含义相关推荐
- c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用
指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...
- c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用
详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...
- 武林c语言,详解C语言中条件编译
预处理器提供条件编译,程序的不同部分可以在不同的条件下编译,从而产生不同的目标代码文件,这对于程序移植和调试非常有用,本文是武林技术频道小编给为大家带来的详解中条件编译,一起来了解一下吧! 通常情况, ...
- c语言指针常量和常量指针,详解C语言中的常量指针和指针常量
概述对于新手来说,指针在c语言里总是一个非常难以理解的概念.在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区 ...
- 详解C语言中的数组指针与指针数组
·详解数组指针与指针数组 ·数组指针 一.区分 首先我们需要了解什么是数组指针以及什么是指针数组,如下图: int *p[5]; int (*p)[5]; 数组指针的意思即为通过指针引用数组,p先和* ...
- 详解C语言中头文件的作用
大家好,先做个自我介绍,我是天蓬,欢迎阅读本篇博文. 由于本人理解能力不是很好,阅读他人文章时,常常看得晕头晕脑,这让我很是头疼,我想,世界上一定还有和我一样的人(哈哈,不是说你么笨哦).所以,我将会 ...
- 一万字详解C语言中长度为零的数组
点击蓝字 关注我们 零长度数组概念: 众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展. ...
- (计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换
文章目录 (1)无符号数和有符号数 (2)长整数变为短整数 (3)短整数变为长整数 在学习完前面几节的内容后,相信大家对数据是如何在计算机中存储.运算的有了更加深入的认识,那么接下来我们就以更深层次的 ...
- c语言字 字符串转换成数组_C语言学习教程之详解C语言中的字符串数组
在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include 总结 以上 ...
- C语言学习教程之详解C语言中的字符串数组
在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <s ...
最新文章
- 高清视频下如何节省带宽?
- 好代码是管出来的——.Net Core集成测试与数据驱动测试
- 苹果手机怎么拍星空_手机拍星空,看这篇教程就够了!
- kettle的行转列主键用法详解(正规化 宽表到窄表的过程)
- Percona XtraDB Cluster(PXC)原理
- ukey其他错误_UKEY不能识别解决方法
- 机器学习鸢尾花数据集分析
- 【论文阅读】Hierarchical Reinforcement Learning for Air-to-Air Combat 基于分层强化学习的空战决策
- Udacity 传感器融合笔记 (一)lidar
- dp光纤线传输距离既然超过百米之长?
- 微信oauth2的认证
- Command python setup.py egg_info failed with error code 1 in /private/var/folders/14/4hz051qx0wqd3
- 快消品图像识别丨无人店背后的商品识别技术
- 微信小程序 实现拨打电话
- 公司企业如何制作微信小程序店铺?
- CFO和财务VP的OKR案例,打造并领导世界一流的金融团队
- ARC与非ARC混合编程
- Objects365数据简介及数据转换为XML格式
- 第十二章:项目采购管理 - (12.0 什么是项目采购管理)
- 8051单片机,利用单片机,发光二极管,构成一个 LED灯控制电路。上电时 , 点亮 LED,实现 LED灯闪烁。运用 Keil 软件 Proteus软件进行编写程序和仿真。