c/c++(疑3) C语言指针与数组之间关系
2015-04-08 08:55
441 查看
c/c++ (疑1)数组和指针
c/c++(疑2) const extern
有了前面 两篇 基础,下面我们可以更深入的来介绍c/c++(疑3) C语言指针与数组之间关系
数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据,但不能存函数。
2 a
来看看下面的代码
上面的注释是我通过查看内存 和 汇编 的一些注释,也保留下来了,可能每台机器不一样,所以地址也不一样。
解释说明:对指针进行加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++(疑2) const extern
有了前面 两篇 基础,下面我们可以更深入的来介绍c/c++(疑3) C语言指针与数组之间关系
1 概述(C语言指针与数组之间关系)
指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址。指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据,但不能存函数。
2 a
和&a 的区别(为下文C语言指针数组和数组指针埋下伏笔)
来看看下面的代码<pre name="code" class="cpp">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 int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); 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++(疑4) 指针数组和数组指针之间关系
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- c语言,指针和数组大小之间的关系
- C语言指针回顾(四) 指针与数组之间的关系
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- C++ 指针与数组的关系及运算
- C语言中指针数组和数组指针的关系
- 【C/C++】深入理解指针和数组的关系
- C语言的指针数组与数组指针关系
- C++指针和C#引用之间的关系。
- C语言-数组和指针之间的较量
- 挑战30天C++入门极限-C/C++中数组和指针类型的关系
- 重学C++ 数组和指针的关系
- C++中一维数组与指针的关系详细总结
- 再谈C语言中数组和指针之间的互操作
- C语言的指针数组与数组指针关系
- 再谈C语言中数组和指针之间的互操作
- C语言指针与数组之间的恩恩怨怨
- C语言中与指针相关问题——论数组名和数组名取地址的关系
- 再谈C语言中数组和指针之间的互操作