当前位置: 首页 > news >正文

C/C++面试可能会问三:指针和数组一样吗?

答案:不一样。


哪里不同?

数组名:数组名的值是一个指针常量,也就是数组第一个元素的地址

它的类型取决于数组元素的类型:如果他们是int类型,那么数组名的类型就是“指向int的常量指针”;如果它们是其他类型,那么数组名的类型也就是“指向其他类型的常量指针”。

总结1:数组名是一个指针常量,不可简单的认为是个指针。它始终指向第一个元素的地址。


那么数组在什么情况下不能作为指针常量呢?

在以下两种场景下:

  • 当数组名作为 sizeof操作符 的操作数的时候,此时sizeof返回的是整个数组的长度,而不是指针数组指针的长度。
  • 当数组名作为 &操作符 的操作数的时候,此时返回的是一个指向数组的指针而不是指向某个数组元素的指针常量

!除了以上两点之外,数据名在其他任何情况下都是指向首元素的指针

更进一步解释:

    指针和数组并不是相等的。为了说明这个概念,请考虑下面两个声明:    

int a[10];
int *b;
  • 声明一个数组时,编译器根据声明所指定的元素数量为数组分配内存空间,然后再创建数组名指向这段空间的起始位置
  • 声明一个指针变量的时候,编译器只为指针本身分配内存空间,并不为任何整型值分配内存空间,指针并未初始化指向任何现有的内存空间

因此,表达式*a是完全合法的,但是表达式*b却是非法的。*b将访问内存中一个不确定的位置,将会导致程序终止。

  • 另一方面b++可以通过编译,a++却不行,因为a是一个常量值。

 

void test01()
{int arr[] = { 1, 2, 3, 4 };//1. sizeof  2.对数组名取地址&arr//以上两种情况下,数组名不是指向首元素的指针//以上两种请款下,数组名是数组类型//!除了以上两点之外,数据名在其他任何情况下都是指向首元素的指针//sizeof 可以不加括号,它是c语言关键字printf("sizeof arr:%d\n", sizeof arr);printf("&arr addr : %d\n", &arr);printf("&arr + 1 addr : %d\n", &arr + 1);   // 数组指针类型:地址直接加了一个数组的长度16字节。相当于类型+1。int *p = arr;//数组名是一个常量指针//arr = NULL;//数组下标能否是负数?//可以是负数p += 3;printf("p[-1]:%d\n", p[-1]);//他们等价printf("p[-1]:%d\n", *(p - 1));//数组指针类型和数组首元素指针类型}
//如何定义一个可以指向数组的指针
void test02()
{int arr[5] = { 1, 2, 3, 4, 5 };//1. 我们先定义数组类型,再定义数组指针类型typedef int(ARRAY_TYPE)[5];  //typedef unsigned int u32ARRAY_TYPE myarray; // int myarray[5];//for (int i = 0; i < 5; ++i){myarray[i] = 100 + i;}for (int i = 0; i < 5; ++i){printf("%d " ,myarray[i]);}//对数组名取地址代表指向整个数组的指针ARRAY_TYPE *pArray = &myarray;pArray = &arr;//1. *pArray 表示拿到pArray指针指向的整个数组//2. *pArray类型就是数组名,指向首元素类型的指针printf("\n*(*pArray + 1) : %d\n", *(*pArray + 1));//2. 直接定义数组指针类型typedef int(*ARRAY_POINTER)[5];ARRAY_POINTER pArr = &arr;//3. 直接定义数组指针变量int(*pArrParam)[5] = &arr;}

http://www.lryc.cn/news/39194.html

相关文章:

  • 数字经济新生态,中小企业如何发展营销数字化
  • 【网络】https协议
  • 【11】SCI易中期刊推荐——计算机方向(中科院4区)
  • STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式2)
  • 【Spring6】| Bean的生命周期(重要)
  • 【C#】单据打印方案(定义打印模板、条形码、二维码、图片、标签)
  • 前后端身份验证
  • 【蓝桥杯嵌入式】ADC模数转换的原理图解析与代码实现(以第十一届省赛为例)——STM32G4
  • Matlab表示 CDF 时间值
  • 基于Halcon的条码定位与识别【包含 一维码 和 二维码 】
  • 每天学一点之多线程
  • 自动化测试必会的数据驱动测试你真的学会了吗?
  • cpp之十大排序算法
  • java-正装照换底色小demo-技术分享
  • (枚举)(模拟)(二位前缀和)99. 激光炸弹
  • vue3+vite项目移动端适配:postcss-pxtorem和amfe-flexible
  • sin x和cos x的导数
  • html下自动消失的提示框jQuery实现
  • 第27篇:Java日期处理总结(一)
  • Linux入门教程——VI/VIM 编辑器
  • 第十四届蓝桥杯三月真题刷题训练——第 10 天
  • 软件测试之jira
  • 传统方式实现SpringMVC
  • RS232/RS485信号接口转12路模拟信号 隔离D/A转换器LED智能调光控制
  • 聊一聊代码重构——封装集合和替换算法的代码实践
  • FPGA解码4K分辨率4line MIPI视频 OV13850采集 提供工程源码和技术支持
  • Map接口及遍历方式
  • 一步步构建自己的前端项目
  • VMware搭建Mac OS环境
  • 【Maven】什么是Maven?Maven有什么用?