c/c++(疑3) C语言指针与数组之间关系
来源:互联网 发布:平面设计美工招聘 编辑:程序博客网 时间:2024/05/12 00:14
c/c++ (疑1)数组和指针
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 ccint *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 ccint *ptr3 = (int *)((int)a+2);//00 00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3cint *ptr4 = (int *)((int)a+3);//00 02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3c d2int *ptr5 = (int *)((int)a+4);//02 00 00 00 03 00 00 00 04 00 00 00 cc cc cc cc 3c d2 d8int *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
&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);//下一篇文章讲解(指针数组,数组指针)
相对稍有复杂,涉及到内存 和大小端,下次介绍!
4 1
- c/c++(疑3) C语言指针与数组之间关系
- C语言数组与指针的关系
- C++预科——C语言指针回顾(四) 指针与数组之间的关系
- C语言的指针数组与数组指针关系
- C语言的指针数组与数组指针关系
- c语言,指针和数组大小之间的关系
- c/c++中指针与字符数组,指针与数组,数组指针与指针数组之间的关系。
- C语言中的数组与指针的关系
- C语言(数组与指针的关系)
- C 语言中指针、字符串与数组的一些关系
- c/c++(疑4) 指针数组和数组指针之间关系
- C语言指针与数组之间的恩恩怨怨
- C语言指针与数组之间的恩恩怨怨
- C语言指针与数组之间的恩恩怨怨
- C语言指针与数组之间的恩恩怨怨详解
- C语言指针与数组
- C语言 指针与数组
- C语言指针与数组
- 第五周 项目2-对象作为数据成员
- 第五周项目1体验常函数成员
- fzu 2185 树的路径覆盖(dfs)
- Mysql 配置文件,适合用于内存为 512MB 的主机
- 第5周项目1-体验常成员函数
- c/c++(疑3) C语言指针与数组之间关系
- spring @Entity @Table
- (R语言)对象,模式和属性
- 第五周项目一
- 第五周项目程序阅读一
- EMV技术学习和研究-持卡人验证
- 第5周项目多文件组织三角形类
- iOS 划线圆形 CGContext
- python获取栅格点和面值