C语言高级编程:数组指针与数组
生活随笔
收集整理的這篇文章主要介紹了
C语言高级编程:数组指针与数组
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
測試平臺:64位?X86?Ubuntu
?
1. 代碼:
#include <stdio.h>void main(void) {char (*p)[5] = NULL;char (*p1)[5] = NULL;char a[5] = {0,1,2,3,4};p = a;p1 = &a;printf("a[5] = %d\n", a[5]);printf("p = %p, p+1 = %p, p1 = %p, P1+1 = %p\n", p, p+1, p1, p1+1);printf("*(char *)p = %d, *((char *)p+1) = %d, *(char *)p1 = %d, *((char *)p1+1) = %d\n", *(char *)p, *((char *)p+1), *(char *)p1, *((char *)p1+1));printf("*(char *)p = %d, *(char *)(p+1) = %d, *(char *)p1 = %d, *(char *)(p1+1) = %d\n", *(char *)p, *(char *)(p+1), *(char *)p1, *(char *)(p1+1));printf("*p = %p, *(p+1) = %p, *p1 = %p, *(P1+1) = %p\n", *p, *(p+1), *p1, *(p1+1));printf("**p = %d, **(p+1) = %d, **p1 = %d, **(P1+1) = %d\n", **p, **(p+1), **p1, **(p1+1)); }?
2. 編譯:
baoli@ubuntu:~/c$ gcc test.c test.c: In function ‘main’: test.c:9:7: warning: assignment from incompatible pointer type [enabled by default]p = a;^?
3. 結(jié)果:
baoli@ubuntu:~/c$ ./a.out a[5] = 127 p = 0x7fff48848650, p+1 = 0x7fff48848655, p1 = 0x7fff48848650, P1+1 = 0x7fff48848655 *(char *)p = 0, *((char *)p+1) = 1, *(char *)p1 = 0, *((char *)p1+1) = 1 *(char *)p = 0, *(char *)(p+1) = 127, *(char *)p1 = 0, *(char *)(p1+1) = 127 *p = 0x7fff48848650, *(p+1) = 0x7fff48848655, *p1 = 0x7fff48848650, *(P1+1) = 0x7fff48848655 **p = 0, **(p+1) = 127, **p1 = 0, **(P1+1) = 127?
4. 分析:
1)p和p1是一個指針,他們指向一個數(shù)組,代表整個數(shù)組的地址。
2)由于a代表數(shù)組首元素的地址,所以賦值給p時出現(xiàn)了警告,編譯器將其進行類型轉(zhuǎn)換后賦值給p,賦值后的p還是代表數(shù)組的地址
3)賦值后的p和p1都代表數(shù)組的地址,而不是首元素的地址。所以p+1=P1+1,且都是偏移5個字節(jié)
4)*(char *)(p+1) =?*(char *)(p1+1) = 127,這里的127應該是a[5]
5)注意:*((char *)p+1) = 1,*(char *)(p+1) = 127
6)由于p是一個指向數(shù)組的指針,*p = p, p+1=*(p+1),why?
類似于兩級指針(把數(shù)組也當成一級指針,盡管數(shù)組不是指針),p代表一個數(shù)組的地址,*(p+0)代表一個數(shù)組首元素的地址,所以p=*p,但是他們表示的范圍不同,**p即代表a[0];p+1與*(p+1)同理。
7)int *p; p = a才正確,因為a代表數(shù)組首元素地址,是一個char元素的地址,即char *。
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的C语言高级编程:数组指针与数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 短期菲利普斯曲线与长期菲利普斯曲线的关系
- 下一篇: 住房抵押贷款需要什么条件 住房抵押贷款的