码迷,mamicode.com
首页 > 编程语言 > 详细

c/c++(疑3) C语言指针与数组之间关系

时间:2015-04-07 23:29:49      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

c/c++ (疑1)数组和指针

c/c++(疑2) const extern

有了前面 两篇 基础,下面我们可以更深入的来介绍c/c++(疑3) C语言指针数组和数组指针

1 概述(C语言指针与数组之间关系

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。


2     a 和&a 的区别为下文C语言指针数组和数组指针埋下伏笔



来看看下面的代码
int _tmain(int argc, _TCHAR* argv[])
{
	int a[4]={1,2,3,4};
	int *ptr0 = (int*)(int)a;//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc
	int *ptr1=(int *)(&a+1);
	int *ptr2=(int *)((int)a+1);//00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc
	int *ptr3 = (int *)((int)a+2);//00 00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3c
	int *ptr4 = (int *)((int)a+3);//00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3c d2
	int *ptr5 = (int *)((int)a+4);//02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3c d2 d8
<span style="white-space:pre">	<span style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22.399999618530273px; background-color: rgb(238, 238, 238);">int *ptr=(int *)(&a+1);</span><br style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22.399999618530273px; background-color: rgb(238, 238, 238);" /><span style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22.399999618530273px; background-color: rgb(238, 238, 238);">   <span style="white-space:pre">		</span>printf("%d,%d",*(a+1),*(ptr-1));</span></span>
	//printf("%x,%x,%x,%x,%x,%x",ptr1[-1],*ptr2,*ptr3,*ptr4,*ptr5);  下一篇文章讲解
	getchar();
	/*
	a  0x00C4F810
	&a[0] 0x00C4F810

	&a 0x00C4F810

	*/
	return 0;
}
上面的注释是我通过查看内存 和 汇编 的一些注释,也保留下来了,可能每台机器不一样,所以地址也不一样。

解释说明:
对指针进行加1 操作,得到的是下一个元素的地址,而不是原有地址值直接加1。所以,一个类型为T 的指针的移动,以sizeof(T) 为移动单位。因此,对上题来说,a 是一个一维数组,数组中有5 个元素; ptr * 是一个int 型的指针。

&a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 4*sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限。

(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr1。

*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,&a+1 是下一个数组的首地址。所以输出2
*(ptr-1): 因为ptr 是指向a[4],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[3] ,输出4。




//printf("%x,%x,%x,%x,%x,%x",ptr1[-1],*ptr2,*ptr3,*ptr4,*ptr5);  下一篇文章讲解
这个相对来说 稍有复杂,设计到内存 和 大小端 


c/c++(疑3) C语言指针与数组之间关系

标签:

原文地址:http://blog.csdn.net/u010236550/article/details/44927383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!