解决关于指针的疑问
来源:互联网 发布:linux 原生 迅雷 64 编辑:程序博客网 时间:2024/05/19 16:51
今天被下面这两个语句弄得有点混:
int array1[5] = {};int *ptr1 = array1;
&
int array2[5] = {};int (*ptr2)[5] = &array2;
同样是指向一个维度为5的数组的指针,但是但从定义的方式上来看就可以知道,这两个还是有区别的:
首先ptr1是一个指向数组的指针,这里用array1去初始化ptr1,我们知道,当我们对数组进行操作的时候,大部分情况下相当于在操作指向数组首元素的一个指针,所以这里的ptr1指向的是array1的首元素。
而ptr2呢,在定义的时候已经指明了它所指向的数组的维度,这里为5,所以如果直接用array2去初始话它在语法上是行不通的,应为应用array2相当于应用了指向array2首元素的一个指针,而array2首元素的维度又不为5,它的类型是int*而非int (*)[5],所以编译就会出错,所以我们只能用取址符对array2进行取址,这样ptr2才指向了维度为5的数组,即ptr2指向的是整个数组,而非首元素,虽然array2和&array2的地址是一样的,因为我们通常用某个地址类表示从这个地址开始的大小不同的比特串,所以这两个是有区别的,既然ptr2指向的是整个数组,那我们要获取ptr2所指向的某个元素是就得用(*ptr2)[index]的形式,而不能是*ptr2[index],应为ptr2只指向一个元素,那就是array2这个整体,所以不能直接对其使用下标运算符,*ptr2[index]会是一个未定义的值,因为ptr2[index]指向了内存中某个本不存在的地方。
使用array1时,它的类型转换成int 而非int()[5]:
*ptr2[index]会是一些未定义的值:
只能使用(*ptr2)[index]:
而对于ptr1则可以使用ptr1[index]的形式,相当于*(prt1 + index):
总之一句话,(*ptr2)相当于ptr1.
- 解决关于指针的疑问
- 关于数组指针的疑问
- 解决关于initializer_list对象拷贝的疑问
- 函数指针的疑问?
- 指针的疑问
- char指针的疑问
- 关于opencv访问像素点的疑问已解决
- 关于wordpress网站文件存放路径的一点疑问解决
- 待解决的疑问
- 关于javascript的疑问
- 关于变压器的疑问
- 关于 LoadLibrary 的疑问
- 关于junit的疑问
- 关于pthread_testcancel()的疑问
- 关于 retainCount 的疑问
- 关于Midi的疑问
- 关于IO的疑问
- 关于const_cast的疑问
- 制作API文档
- 分解质因数之codeforces_588B
- C++ const函数返回值必须为const引用
- hibernate集合映射inverse和cascade详解
- linux系统常用命令
- 解决关于指针的疑问
- 005-进制转换
- CodeForces 629BFar Relative’s Problem
- UVA 1149 Bin Packing
- 树莓派3b(ubuntu16.04)安装mcp2515驱动
- Android 异常上报类
- MySQL常用的函数介绍
- 文章标题
- 按键精灵+屏幕录像专家实现数据抓包录制