数组指针
来源:互联网 发布:网络管理工程师培训 编辑:程序博客网 时间:2024/06/05 12:00
#include <stdlib.h>
using namespace std;
int main()
{
int arr1[5]={0,1,2,3,4};
cout<<*(arr1+3)<<endl;
cout<<*(*(&arr1+1)-2)<<endl;
int arr[3][3] = {0,1,2,
3,4,5,
6,7,8};
//这两个地址相同,但指针代表的类型不一样
cout<<&arr+3<<endl;
cout<<*(&arr+3)<<endl;
//判断是不是类型不一样在加个偏移量看得到的结果不同就知道了
cout<<**((&arr+2)+1)<<endl;
cout<<*(*(&arr+2)+1)<<endl;
cin.get();
return 0;
}
arr的类型是int [4],arr虽然可以当做指针使用,但是它实际上是一个数组类型,不信的话试试下面的输出:
int arr[4]. *p; // sizeof(arr) = 16, sizeof(p) = 4
然后&arr是什么类型呢,C语言中对任何一个东西取地址运算(&),都成为指针类型,那么它(&arr)的类型就是一个指针,指向什么?指向一个数组。这个指针怎么声明呢,是这个样子的:int (*p_arr) [4] = &arr;
p_arr是一个指针,指向一个数组,数组的长度是4,数组中每个元素的类型是int。
假设数组arr所在的起始位置是0(实际不可能,只是为了计算方便),arr+4的值是多少?arr虽然是数组类型,但是arr在使用的时候它被编译器认为是指向数组第一个元素的指针,它的值就是数组第一个元素的地址,即0,那么arr+4 = 0 + 4*4 = 16。然后&arr+4的值是多少呢?&arr是指针类型,指向一个数组,已知数组的大小是16字节(参考上面的sizeof(arr)),那么&arr + 4 = 0 + 16*4 = 64。那么&arr+4是什么类型的呢?很容易判断&arr+4的类型就是&arr的类型,由上面的分析可知,是int (*)[4]类型。*(&arr+4)又是什么类型?已知类型int (*)[4],执行指针的解引用操作(指针降级),就是去掉一个*符号,总而言之,就是int [4]类型。看到没有,指向数组类型的指针降级之后就变成数组类型了。数组类型在使用过程中仍被编译器看做一个指针,这就是为什么两行的输出是一模一样的:编译器打印一个指针时显示的是指针的值(64),编译器在打印一个数组时打印出来的是数组第一个元素的地址(64+0*4=64)
- 指针数组、数组指针
- 指针数组/数组指针
- 指针数组/数组指针
- 数组指针 指针数组
- 指针数组,数组指针
- 数组,指针,数组指针
- 数组,指针,数组指针
- 指针数组&数组指针
- 指针数组&数组指针
- 数组指针 指针数组
- 指针数组/数组指针
- 数组指针&指针数组
- 数组指针 指针数组
- 数组指针 指针数组
- 指针数组 数组指针
- 指针数组,数组指针
- 指针数组 数组指针
- 指针数组&数组指针
- coredump
- 如何在windows运行时应用中拍照
- android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新;
- [Cocoa]_[初级]_[根据所要显示的内容,动态创建NSTextField(Label),并在一个NSView内显示]
- SQL面试题
- 数组指针
- 关于XMPP和openfire中的消息回执和聊天状态
- Using R — Basic error Handing with tryCatch()
- MySQL sql 语句
- Using R — Easier Error Handling with try()
- tnsnames.ora(转载)
- 解决IE下document.getElementsByName无法获取DIV,span标签
- Asp.net整合Disucuz X 通过Ucenter同步登陆
- JAVA动态绑定的内部实现机制