數組和指針的區別

直接看例子:數組

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指針和數組的差異,及指針訪問數組的方法確定全懂了。下面的總結不重要,上面的代碼打印方式纔是我精心想出來的,但仍是總結下吧!spa

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

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

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

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

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

相關文章
相關標籤/搜索