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

指针测试总结(一)(一维数组)

1.取一维数组的首地址

int main()
{int arr[3] = {5,8,1}; printf("%d\n",arr);printf("%d\n",&arr);printf("%d\n",&arr[0]);printf("%d\n",&arr+0);
}

输出结果:
1096809108
1096809108
1096809108
1096809108

说明arr,&arr,&arr[0],&arr+0都可以取到arr数组或者说数组第一个元素的地址

2.取一维数组第一个元素的值

int main()
{int arr[3] = {5,8,1}; printf("%d\n",*arr);printf("%d,%d\n",arr,*(&arr));printf("%d\n",*(&arr[0]));printf("%d\n",*(&arr+0));printf("%d\n",arr[0]);//printf("%d\n",*(arr[0]));//错误,arr[0]已经取到第一个元素的值了
}
}
输出结果:
5
-295700460,-295700460
5
-295700460
5
5
5//*arr,*(&arr[0]),arr[0]都输出的arr的第一个元素,而*(&arr)和*(&arr+0)并不能取数组第一个元素的值
说明:*arr,*(&arr[0]),arr[0]都输出的arr的第一个元素,而*(&arr)*(&arr+0)并不能取数组第一个元素的值

3.取一维数组第二个元素的地址

int main()
{int arr[3] = {5,8,1}; printf("%d %d\n",arr,arr+1);printf("%d\n",&arr+1);printf("%d\n",&arr[1]);
}

输出结果:
1696594580 1696594584
1696594592 //
1696594584

说明arr+1,&arr[1]可以取到数组第二个元素的地址,而使用&arr+1并不能代表数组第二个元素的地址

4.取一维数组第二个元素的值

int main()
{int arr[3] = {5,8,1}; printf("%d\n",*(arr+1));printf("%d\n",*(&arr+1));printf("%d\n",*(&arr[1]));printf("%d\n",arr[1]);
}

输出结果:
8
1654651952
8
8

说明*(arr+1),*(&arr[1]),arr[1]可以取到数组第二个元素的值,而使用*(&arr+1)并不能取到数组第二个元素的值
1. *arr,*(&arr[0])都输出的arr的第一个元素,而*(&arr)*(&arr+0)并不能取数组第一个元素的值
2. arr,&arr,&arr[0],&arr+0都可以取到arr数组或者说数组第一个元素的地址
3. arr+1,&arr[1]可以取到数组第二个元素的地址,而使用&arr+1并不能代表数组第二个元素的地址
4. *(arr+1),*(&arr[1])可以代表数组第二个元素,而使用*(&arr+1)并不能代表数组第二个元素
总结:
取第一个元素的值和地址可以分别使用*arr,*(&arr[0])和arr,&arr,&arr[0],&arr+0
取第二个元素的值和地址可以使用和(arr+1),*(&arr[1])和arr+1,&arr[1]
总之,为避免出错,
取第一个元素的值和地址可以分别使用*arr,arr[0],*(&arr[0])和arr,&arr[0]
取第n+1个元素的值和地址可以分别使用*(arr+n),*(&arr[n])和arr+n,&arr[1]

尝试定义指针来代表这四个值:

1.取一维数组第一个元素的地址

int main()
{int arr[3] = {5,8,1}; int*p = arr;printf("%d\n",p);printf("%d\n",&p);printf("%d\n",&p[0]);printf("%d\n",&p+0);printf("%d\n",p+0);
}

输出结果:
1883241956
1883241944
1883241956
1883241944
1883241956

说明p,&p[0],p+0可以取到数组第一个元素的地址;&p,&p+0不可以

2.取一维数组的首元素的值

int main()
{int arr[3] = {5,8,1}; int*p = arr;printf("%d\n",*p);printf("%d\n",*(&p));printf("%d\n",p[0]);printf("%d\n",*(p+0));
}

输出结果
5
-813695980
5
5

说明:*p,p[0]*(p+0)都可以用来表示第一个元素的值,而*(&p)不可以

3.取一维数组第二个元素的地址

int main()
{int arr[3] = {5,8,1}; int*p = arr;printf("%d\n",&p[1]);printf("%d\n",&p+1);printf("%d\n",p+1);
}

输出结果:
-788530008
-788530016
-788530008

说明&p[1],p+1可以取到数组第二个元素的地址;而&p+1不可以

4.取一维数组第二个元素的值

int main()
{int arr[3] = {5,8,1};int*p = arr;printf("%d\n",*(p+1));printf("%d\n",*(&p+1));printf("%d\n",*(&p[1]));printf("%d\n",p[1]);
}

输出结果:
8
0
8
8

说明*(p+1)*(&p[1]),p[1]都可以表示第二个元素的值,而*(&p+1)不可以

总结:&arr,&p,&arr+n,&p+n不能单独使用,必须使用&arr[n],&p[n]规范化:1. 引用数组第一个元素地址:arr或者&arr[0]; p或者p+0或者&p[0]2. 引用数组第一个元素值:*arr,arr[0]或者*(&arr[0])*p或者*(p+0)或者p[0]3. 引用数组第二个元素地址:arr+1或者&arr[1]; p+1或者&p[1]4. 引用数组第二个元素值:*(arr+1),arr[1]*(&arr[1])*(p+1),p[1]或者*(&p[1])

http://www.mrgr.cn/news/78064.html

相关文章:

  • 【从零开始的LeetCode-算法】43. 网络延迟时间
  • 2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest(ABCGJLN)
  • Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)
  • Cocos游戏优化
  • 使用go实现流式输出
  • Ray 和 PyTorch
  • CTF-RE 从0到 N: 高版本 APK 调试 + APK逻辑修改再打包 + os层调试[2024 强网杯青少年专项赛 Flip_over] writeup
  • Apollo9.0源码部署(Nvidia显卡)
  • Nacos学习文档
  • Python + 深度学习从 0 到 1(00 / 99)
  • Qt Graphics View 绘图架构
  • ubuntu中使用ffmpeg和nginx推http hls视频流
  • 大表建/重建索引
  • 【ONE·基础算法 || 动态规划(二)】
  • C++ —— 以真我之名 如飞花般绚丽 - 智能指针
  • 极智嘉嵌入式面试题及参考答案
  • 不同查询构建器的使用方式(Mybatis、Mybatis-Plus、Mybatis-Flex、Spring Data JPA、QueryDsl)
  • 【Unity基础】如何选择渲染管线?
  • Failed to find SV in PRN block of SINEX file (Name svnav.dat)
  • [OpenGL]使用OpenGL+OIT实现透明效果
  • 内存不足引发C++程序闪退崩溃问题的分析与总结
  • 2024 年:Kubernetes 包管理的新前沿
  • AI:电商平台销售效率提升的魔法钥匙
  • 深度学习笔记1:自动微分与神经网络实现(附代码)
  • Springboot 整合 Java DL4J 搭建智能问答系统
  • 小米C++ 面试题及参考答案下(120道面试题覆盖各种类型八股文)