关于对C语言中数组名取地址加减等操作的一点探究
对于数组名取地址强制转换的操作
偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西。
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{int a[5] = { 1,2,3,4,5};int* ptr = (int *)(&a + 1);printf("%d,%d", *(a + 1), *(ptr - 1));return 0;
}
这里设置了一个长度为5的数组,之后定义一个int类型的指针将对a的首地址求地址后加1然后再次强制转换成int类型的指针传递给ptr,我第一反应是a不就是代表指向首个元素的地址吗,为什么还要对它求地址,另外求完地址之后+1操作再次把一个指向地址转换成指针类型给了ptr,这让我十分费解,我们先来看输出结果
输出案例1:
之后我首先删除了(int *)试着查看结果:
int* ptr = (&a + 1);
输出案例2:
发现输出案例是没有变化了,所以说明这里强制转化实质上是没有起到任何效果的,但是对于指针的强制类型转换真的没有用吗?
探究强制转换
无论任何类型的指针都是占四个字节的,只不过指向的值的类型不同从而定义为不同的类型,所以这里的强制类型转化应该是为了抱着把数组名这个指针转化成int类型的指针。所以我又做了如下测试:
把数组a改成char类型
(忽略那个没有刷新的缺少;分号)对于int的初始化使用char,会产生警告,所以这里强制转化我们是可以理解了。
探究对于数组名取地址
在网上翻阅其他博客后查阅得知,因为数组名是一个右值,而求址运算符&是需要有具体的内存空间,也就是变量
//另外我们需要明确数组名和指针有一个区别是:数组名是符号地址常量,只是代表了数组中首个元素的地址,而没有明确的内存空间去存储它(也就是为什么不把数组名直接称为指针),在编译时求值并存在编译器的符号表里面,其值就是个内存地址,而指针是指向某一片区域,并且有一个内存空间存储这个指针,因此有了二级指针三级指针的概念,而对于数组求地址还是它自己。
所以对于数组名取地址在早期的编译器当中是非法的,但是现在是未定义的,因此我们改变代码后查看结果:
int* ptr = (int *)(a + 1);
输出案例3:
这里去掉&后得到的答案却变了,这是因为含&时,对于一个t类型的地址a将进行a+长度**运算数*sizeof(t) ,而这里不含&时,将只是简单的对于地址进行加减 运算数 操作。
###加减过程
如上所说的运算过程,这里我们只需要注意一个点也就是含&时的运算
这里我们对代码进行修改供参考。
数组a的长度为5时:
数组a的长度为4时:
(可以看到这里地址的加减是和长度有关的)
至于和操作数和sizeof()的关系各位可以下去试一试。
------男儿何不带吴钩,收取关山五十州。
by二十岁的编程男神王大爷
关于对C语言中数组名取地址加减等操作的一点探究相关推荐
- c语言 如何对数组取地址,C语言 对数组名取地址
作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 演示样例: int a[5] = {1,2,3,4,5}; int *p = (int * ...
- 二维数组名取地址加一
二维数组和二维数组名: 对于一位数组我们认识到其数据元素在内存中是按线性顺序依次排列的,且一维数组名的值是一个指针常量.那么二维数组在内存中又是怎么存储的,其数组名又有什么含义呢? 定义一个二维 ...
- 数组名和数组名取地址
在C中,在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址. 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是"指向int的常量指针& ...
- 数组名和数组名取地址 的区别
在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址. 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是"指向int的常量指针 ...
- C语言中的数组名取地址
今天看到这样一道题目,有点懵,记录一下 c语言中的对数组名取地址是什么意思? c中对数组名取地址,实际得到的是指向该一维数组的指针,对于上述题目中的&arr,表示指向一维数组arr的指针,*( ...
- C语言的数组名和对数组名取地址
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
- 从编译器角度分析C语言中数组名和指针的区别
从编译器角度分析C语言中数组名和指针的区别 数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变. 例如你可 ...
- C语言数组名、数组名取地址、数组首元素地址之间的关系
C语言中数组名a.数组名取地址&a.数组首元素地址&a[0]三者的概念有点绕,花了点时间好好琢磨了一下,将自己的理解记录下来,如有错误之处,欢迎赐教. 首先看下面的一小段代码: #in ...
- C语言中数组名到底是什么?
一般情况下,C语言中数组名在表达式中被解读为指向数组首元素的指针 C语言中数组名在表达式中被解读为指向数组首元素的指针, 即数组名在表达式中值为数组首元素的地址.(但有个例外,int a[2];int ...
最新文章
- webstorm常用快捷键
- 动态规划算法的优化技巧
- 同一行 绝对定位_电路改造10大点:定位、开槽等,终于有人说清了!
- 给容器中注册组件 || @Scope -- @Lazy -- @Conditional({Condition}) -- @Import--使用Spring提供的 FactoryBean
- Qt实现QTextEdit背景透明
- 因为此网站使用了 hsts_长春定制小程序服务,网站设计市场价格
- VB 判断是否文本文件
- 结对编程-黄金点游戏之旅[二]
- 面试题1,值传递和参数传递
- 计算几何基本知识整理
- 微信小程序轮播图实现详解
- 网站建设经验分享:如何设计及运营网站
- C++学习(四零零)百度文库页面的核心代码(水印部分)
- 键盘上每个键作用!!! (史上最全的)
- 8代cpu核数及线程
- 天平应什么放置_天平的使用规程
- @Validated和@Valid 解决list校验问题
- 求助大佬,python类的问题
- Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
- HDU1495 非常可乐 【BFS】