解析:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 每一种表达式的含义

 一、先解决一个问题:什么是指针
指针就是存放地址的变量。很好,百度上就是这个答案(哈哈,感觉这句话很废话)。
指针是一个大小固定为4个byte的变量,不管是什么类型的指针大小都是固定的,因为存放是一个地址信息。
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] 的含义相关推荐

  1. c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...

  2. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  3. 武林c语言,详解C语言中条件编译

    预处理器提供条件编译,程序的不同部分可以在不同的条件下编译,从而产生不同的目标代码文件,这对于程序移植和调试非常有用,本文是武林技术频道小编给为大家带来的详解中条件编译,一起来了解一下吧! 通常情况, ...

  4. c语言指针常量和常量指针,详解C语言中的常量指针和指针常量

    概述对于新手来说,指针在c语言里总是一个非常难以理解的概念.在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区 ...

  5. 详解C语言中的数组指针与指针数组

    ·详解数组指针与指针数组 ·数组指针 一.区分 首先我们需要了解什么是数组指针以及什么是指针数组,如下图: int *p[5]; int (*p)[5]; 数组指针的意思即为通过指针引用数组,p先和* ...

  6. 详解C语言中头文件的作用

    大家好,先做个自我介绍,我是天蓬,欢迎阅读本篇博文. 由于本人理解能力不是很好,阅读他人文章时,常常看得晕头晕脑,这让我很是头疼,我想,世界上一定还有和我一样的人(哈哈,不是说你么笨哦).所以,我将会 ...

  7. 一万字详解C语言中长度为零的数组

    点击蓝字 关注我们 零长度数组概念: 众所周知, GNU/GCC 在标准的 C/C++ 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展. ...

  8. (计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换

    文章目录 (1)无符号数和有符号数 (2)长整数变为短整数 (3)短整数变为长整数 在学习完前面几节的内容后,相信大家对数据是如何在计算机中存储.运算的有了更加深入的认识,那么接下来我们就以更深层次的 ...

  9. c语言字 字符串转换成数组_C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include 总结 以上 ...

  10. C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <s ...

最新文章

  1. 高清视频下如何节省带宽?
  2. 好代码是管出来的——.Net Core集成测试与数据驱动测试
  3. 苹果手机怎么拍星空_手机拍星空,看这篇教程就够了!
  4. kettle的行转列主键用法详解(正规化 宽表到窄表的过程)
  5. Percona XtraDB Cluster(PXC)原理
  6. ukey其他错误_UKEY不能识别解决方法
  7. 机器学习鸢尾花数据集分析
  8. 【论文阅读】Hierarchical Reinforcement Learning for Air-to-Air Combat 基于分层强化学习的空战决策
  9. Udacity 传感器融合笔记 (一)lidar
  10. dp光纤线传输距离既然超过百米之长?
  11. 微信oauth2的认证
  12. Command python setup.py egg_info failed with error code 1 in /private/var/folders/14/4hz051qx0wqd3
  13. 快消品图像识别丨无人店背后的商品识别技术
  14. 微信小程序 实现拨打电话
  15. 公司企业如何制作微信小程序店铺?
  16. CFO和财务VP的OKR案例,打造并领导世界一流的金融团队
  17. ARC与非ARC混合编程
  18. Objects365数据简介及数据转换为XML格式
  19. 第十二章:项目采购管理 - (12.0 什么是项目采购管理)
  20. 8051单片机,利用单片机,发光二极管,构成一个 LED灯控制电路。上电时 , 点亮 LED,实现 LED灯闪烁。运用 Keil 软件 Proteus软件进行编写程序和仿真。

热门文章

  1. 敏捷宣言的第五项原则
  2. 在华为P50 Pro中,听到AI异构通信的朱弦三叹
  3. 计算机绘图员证有无取消,计算机辅助设计
  4. Nosql数据库有哪些,分别适用什么场景
  5. Java面向对象之简单项目制作(DVD管理系统)
  6. 2021辽宁省赛-I.完美主义-M.比赛
  7. javascript网页设计作业——初音动漫(6页) dreamweaver作业静态HTML网页设计模板
  8. 功能测试报告怎么写?进来看标准模板
  9. 大数据系列5:地理信息系统PostGis
  10. 帝国CMS7.5基于es(Elasticsearch)7.x的全文搜索插件