详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含义 您所在的位置:网站首页 指向的英文是什么 详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含义

详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含义

2024-07-10 13:56| 来源: 网络整理| 查看: 265

这里写目录标题c语言中的指针p,p+1,*(p+1),*p+1,p[0],&p[0]的含义详解 什么是指针指针P与指针P+1数组和指针*(P+1)和P[1]

什么是指针

指针就是存放地址的变量。很好,百度上就是这个答案(哈哈,感觉这句话很废话)。 指针是一个大小固定为4个byte的变量,不管是什么类型的指针大小都是固定的,因为存放是一个地址信息。

void main() { int a = 1; char b = 'a'; int* i = &a;//指向一个int值变量 char* c = &b;//指向一个char值变量 }

在这里插入图片描述

指针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]

也是用上面的程序,我直接上运行结果,一看就知道了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021040317331561.png 这大概是写法不同把,我个人的理解应该是跟上面第三点的两种取值方法原理相似。我做了以下的尝试

void main() { int a[] = {1,4,3,4}; }

在这里插入图片描述 可以正常运行,没有报错,这里就证明我的一个猜想,定义一个int类型的数组a,可以直接把a当做一个指向数组a首地址的int类型的指针使用。这就是说,定义一个int数组其实编译器内部开辟一个内存块和指向首地址int类型的指针给我们。 到这里,最后一个&P[0]的含义就很明显了,可以看成取数组第一元素的地址。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有