tag 标签: 数组、指针

相关博文
  • 热度 12
    2012-9-18 16:23
    1383 次阅读|
    0 个评论
    指针数组:首先是一个数组,数组中的元素为指针。所占内存由元素个数决定。 数组指针:首先是一个指针,该指针指向一个数组,所占内存在32位系统下为4字节(地址占字节数)。 eg: int *p1 ;//指针数组,数组中的元素为指向一个整型数据的指针。 int (*p2) ;//数组指针 说明:p1与 = {1,2,3,4,5};     int *ptr = (int *)(a+1);     printf("%d,%d\n",*(a+1),*(ptr-1));      printf("%x\n",a+1);//地址的强制类型转换     printf("%x\n",(unsigned long)(a)+1);     printf("%x\n",(unsigned long*)(a)+1);     while(1); }   输出结果如图所示: *(a+1)表示a 的值,*(ptr-1)表示a 的值。 a+1:数组a首地址加1,指向下一个数组,即a 。结果为:0x0019fa24+5*sizeof(int)=0x0019fa38 (unsigned long)(a)+1:把数组a的首地址强制转换成一个长整型数,再加1,为长整形数加1。即在a的值的基础上加1。0x0019fa24+1=0x0019fa25 (unsigned long*)(a)+1: 把数组a的首地址强制转换成一个地址,再加1,地址是占4个字节,所以结果为:0x0019fa24+4=0x0019fa28   #include stdio.h void main() {     char a = {'A','B','C','D'};     char (*p1) = a;     char (*p2) = a;       char (*p3) = a;     char (*p4) = a;       char (*p5) = a;     char (*p6) = a;     while(1); }   p1、p2、p3、p4、p5、p6都为数组指针,当把a赋值给他们时,在下标相同的情况下,因为a表示数组a的首地址,而p1也是指向一个5个字符元素的指针,两边类型完全相同,不会有警告。而把a赋值给p2时,因为a表示的是首元素的首地址,表示一个元素的地址,而不是数组的地址,当赋值给p2指向一个5个元素的数组的指针时,=两边类型不一致,有警告。当数组元素个数不相同时,也是有同样的警告。p1、p2、p3、p4、p5、p6分别加1的结果如下图所示:   · +1是加的n*sizeof(char),n表示p1、p2、p3、p4、p5、p6指向的数组中元素的个数。       在分析二维数组和指针时,要学会画内存布局图。
  • 热度 14
    2012-9-17 17:30
    1371 次阅读|
    0 个评论
        int *a; //a是一个地址,在32位系统下占4个字节空间 int a ; printf("\n%d\n",sizeof(a));//名字a表示整块内存的名字,4*100 printf("%d\n",sizeof(a ));//并不出错,sizeof是关键字,关键字求值是在编译的时候,不想函数求值,在运行的时候。此处虽然不存在a 这个元素,但这里没有真正访问a ,而是仅仅根据数组元素类型确定其值。 printf("%d\n",sizeof(a));//数组a的首地址 printf("%d\n",sizeof(a ));//数组元素a 的首地址,它与a的值应该是一样的,但代表不同的意义。     a不能作为左值,不能操作整个数组,只能通过数组元素(a )赋值。 a作为右值时代表数组首元素a 的首地址,不是数组的首地址。 指针 int * p = NULL;//p变量的值是0x00000000,指针变量初始化,在编译时进行 *p = NULL;//p指向的内存中存的值是0x00000000,计算在运行时进行 对指针的加1操作,得到的是下一个元素的地址,不是在原有地址上直接加1,所以一个类型为T的指针的移动,是以sizeof(T)为单位移动的。 定义int a ; a, a , a的区别,a+1, a +1, a+1的区别。 :作为右值,表示数组首元素的首地址,与a 的意义一样。 :表示取整个数组的首地址。 a+1:表示移动一个元素,即得到a 的地址,与a +1意义一样,加1表示移动一个元素。 a+1:表示移动一个数组长度,即得到下一个数组的地址。整个数组的首地址移动sizeof(a)的值,即a+5*4。得到下一个数组首地址,指向a 。 例子 #include stdio.h void main() {     int a = {1,2,3,4,5};     int *ptr = (int *)(a+1);     printf("%d,%d",*(a+1),*(ptr-1));     while(1); } 结果为2,5。   a的地址为0x002af7d4,a+1表示下一个元素的地址,因为a是整形数据,所以在a的地址上加上sizeof(int)=4,得到0x002af7d8。而a+1表示下一个数组的地址,指向的是a ,它是在a的值(与a的地址相同)的基础上加上5* sizeof(int)=20,所以得到a+1的地址为0x002af7d4+0x14=0x002af7e8。ptr-1指向a 。可以看到当改变a 的值时,a+1的第一个元素的值也跟着改变,因为a+1指向a 。