从一道习题来学习数组指针
来源:互联网 发布:linux nslookup 命令 编辑:程序博客网 时间:2024/06/05 15:26
这段代码:
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5};
int* ptr = (int*)(&a+1);
printf("%d,%d",*(a+1), *(ptr-1));
return 0;
}
第一个结果很简单,对a+1的地址取内容就是数组的第2个元素,即2。
ptr这个指针到底指向哪里呢?这取决于&a是个什么类型的地址,我们先说答案,这个类型是数组指针,数组指针的步长是整个数组,即sizeof(a),在这里等于20。那么,&a+1就移动到了数组的最后一个元素的下一个字节处。我们把这个地址转换成int*指针,用ptr指代,int*指针的步长是sizeof(int),这里等于4。现在,ptr-1,就移动到了数组的最后一个int元素开始的位置。取内容,自然就是5。所以第2的答案是5。
我们先总体概括下,指针就是一个地址,所以sizeof(指针)大家就是地址长度,一般就是4。同时指针还有一个概念容易被我们忽视 ,就是步长。指针的步长是由指针本身指向的类型长度决定的。
比如int型指针,由于指向的是int,sizeof(int)一般是4,那么步长就是4。
再说数组型指针,由于指向的是数组,所以步长就是sizeof(数组),如上面那个就是20。
ok,那么为什么&a是一个数组指针呢?从定义来看吧。a是个数组名,数组名就是数组首元素的地址,那么也就是个指针了,即a和&a[0]一样的。指向的地址相同,步长也相同。但是&a,是int (*p)[ 5]; p=&a; 虽然p指向的地址的值实际上和a以及&a[0]相同,但是步长不同。于是我们知道了,对数组名取地址,就相当于得到数组的指针。
还有一个概念叫指针数组,比如int* p[5], 它的实质是个数组,只是每个元素是个int型指针,两者没什么太大的关系。
- 从一道习题来学习数组指针
- (转)从一道面试题来搞清楚数组指针
- [C++ 学习] C++ Primer 习题 4.36 指针数组 & 数组指针
- 从一道面试题看指针与数组的区别
- 从一道面试题看指针与数组的区别
- 从一道面试题看指针与数组的区别
- 从一道面试题看指针与数组的区别
- 数组指针习题
- 从一道C语言数组指针的笔试题看面试者的能力和心态
- 【重新上本科】从一道笔试题来看数组和指针的区别(c++)
- 多维数组和指针数组 Linux C编程一站式学习习题答案
- 这一道伤是从何处来
- 从一道面试题理解双重指针
- 指针和数组equal的一道题
- 关于数组指针的一道面试题
- 关于数组指针的一道题
- 二维数组中的指针+一道面试题
- 经典C++数组指针学习题
- java架构师知识集合
- LeetCode——Binary Tree Inorder Traversal
- 一个灰常适合愚人节与朋友间玩笑的小恶意程序
- Sharepoint学习笔记—架构系列-- Sharepoint的数据模型(DataModel)、数据管理(Data Management)与查询(Query System)
- Trapping Rain Water
- 从一道习题来学习数组指针
- Bing Maps中使用Google全球本地化搜索服务详解
- OC字符串NSString类的模拟
- ModelState.IsValid
- SQL Servr 2008空间数据应用系列一:空间信息基础
- git push的问题
- MFC多线程调用UpdateData函数问题
- Struts之action的请求接受参数
- HTTPS与SSL(二)