數組和指針的區別


直接看例子:

int main( )
{
    
    char *p ;

    printf("打印下標第0和第6個元素所在地址:&a=%x,&a+1=%x\n\n",&a,&a+1);//答應下標第0和第6個元素所在地址:

    printf("注意有(char *)和沒有的區別:(char *)(&a+1)-1=%x,(&a+1)-1=%x\n\n",(char *)(&a+1)-1,(&a+1)-1);

    p="zhangning";

//*(p+1)='e';//注意與下面同樣一句話的差別,這就是指針和數組的差別,數組對象存放在變量區,指針指向的內容存放在常量區,變量可變,常量則不可。

    printf("打印指針變量p的地址:&p=%x\n",&p);
    printf("打印字符串所在內存首地址:p=%x\n",p);
    printf("打印字符串:p=%s\n\n",p);

    p = a;

*(p+1) = 'e';

    printf("打印數組首地址的方法:a=%x,&a=%x,p=%x,*(&p)=%x\n\n",a,&a,p,*(&p));//打印數組首地址的方法


    printf("打印字符串數組的方法:a=%s,p=%s\n\n",a,p);//打印字符串數組的方法

    //打印下標為1的元素
    printf("打印下標為1的元素:a[1]=%c,*(a+1)=%c,p[1]=%c,*(p+1)=%c,*((&a+1)-4)=%c\n\n",a[1],*(a+1),p[1],*(p+1),\
    *((char *)(&a+1)-5));

    //打印下標為1的元素所在地址
    printf("打印下標為1的元素所在地址:&a[1]=%x,a+1=%x,p[1]=%x,p+1=%x,(&a+1)-4=%x\n\n",&a[1],a+1,p[1],p+1,(char *)(&a+1)-5);
    
    return 0;
}
輸出結果:

打印下標第0和第6個元素所在地址:&a=928000,&a+1=928006

注意有(char *)和沒有的區別:(char *)(&a+1)-1=928005,(&a+1)-1=928000

打印指針變量p的地址:&p=75f914
打印字符串所在內存首地址:p=9258a4
打印字符串:p=zhangning

打印數組首地址的方法:a=928000,&a=928000,p=928000,*(&p)=928000

打印字符串數組的方法:a=hello,p=hello

打印下標為1的元素:a[1]=e,*(a+1)=e,p[1]=e,*(p+1)=e,*((&a+1)-4)=e

打印下標為1的元素所在地址:&a[1]=928001,a+1=928001,p[1]=65,p+1=928001,(&a+1)-4=928001

如果你把上面每句printf都搞懂,f指針和數組的差別,及指針訪問數組的方法肯定全懂了。下面的總結不重要,上面的代碼打印方式才是我精心想出來的,但還是總結下吧!

總結:1,對於數組,a指首元素地址,&a指整個數組(對象)的首地址,故a和&a值相等。

   2,a+1跨了一個sizeof(a[0])是第二個元素地址,但&a+1是跨了一個sizeof(a)的地址。

   3,注意(char *)(&a+1)-1和(&a+1)-1的區別。

      4,a[1] = *(a+1),同樣p[1] = *(p+1)。

   5,表示字符串時&a和a指向該字符串的首地址,p指向字符串首地址,&p沒有意義

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM