C语言指针学习(续)
五、數組和指針的關系
int array[10] = {0,1,2,3,4,5,6,7,8,9},value; ... ... value = array[0];//也可以寫成 value = *array;value = array[3];//也可以寫成 value = *(array+3);value = array[4];//也可以寫成 value = *(array+4);上例中,一般而言,數組名array代表數組本身,類型是int[10];如果把array看作指針的話,它指向數組的第0個單元,類型是int *,所指向的類型是數組單元的類型 int ,因此*array = 0 就一點也不奇怪了。同理,(array+3)指向數組單元的第三個指針,所以*(array+3) = 3 ;
char *str[3] = { "Hellp,this is a sample", "Hi ,good morning ", "Hello world" };char s[80]; strcpy(s,str[0]);//也可以寫成 strcpy(s,*str); strcpy(s,str[1]);//也可以寫成strcpy(s,*(str+1));
上例中,str是一個三單元的數組,該數組的每個單元都是一個指針,這些指針每個都指向一個字符串,如果把數組名看作指針的話,它指向數組的第0號元素,類型是char** ,指向的類型是 char *;
*str 也是一個指針,它的類型是char*,指向的類型是char ,它指向的地址是字符串 “Hello,this is a sample”的第一個字符H的地址。*(str+1)也是一個指針,他的類型是char*,指向的類型是char,指向“Hi,good morning”的第一個字符H的地址。
在不同的表達式中,數組名array可以扮演不同的角色 。在表達式sizeof(array)數組名array 代表數組本身,故測出的是整個數組的大小。在表達式*array中,array扮演的是一個指針,所以該表達式就是數組第0號單元的值。sizeof(*array)測出的是數組單元的大小。表達式array+n,array扮演的是指針,故array+n也是指針,他的類型是type*,指向的類型是type,指向數組第n號單元,故sizeof(array+n)測出的是指針類型的大小。
六、指針和結構類型的關系
struct mystruct {int a ;int b;int c; }mystruct ss = {20,30,40}; mystruct *ptr = &ss;//聲明了一個指向結構對象ss的指針,它的類型是myStruct * ,指向的類型是mystructint *pstr = (int *)&ss//聲明了一個指向結構對象ss的指針。但是他的類型和它指向的類型和ptr是不同的,請問如何通過指針ptr來訪問ss的三個成員變量答案:
ptr ->a; ptr ->b; ptr ->c;請問如何通過指針pstr來訪問ss的三個成員變量 答案*pstr; *(pstr+1); *(pstr+2);這樣使用pstr來訪問結構成員是不正規的。那么該怎么樣來通過指針訪問數組的各個單元呢?
int array[3]={35,56,37}; int *pa = array; //通過指針pa訪問數組array的三個單元的方法是: *pa; *(pa+1); *(pa+2);從格式上看倒是與通過指針訪問結構成員的不正規方法的格式一樣.所有的C/C++編譯器在排列數組的單元時,總是把各個數組單元存放在連續的存儲區里,單元和單元之間沒有空隙。但在存放結構對象的各個成員時,在某種編譯環境下,可能會需要字對齊或雙字對齊或者是別的什么對齊,需要在相鄰兩個成員之間加若干個“填充字節”,這就導致各個成員之間可能會有若干個字節的空隙。所以,在例十二中,即使*pstr訪問到了結構對象ss的第一個成員變量a,也不能保證*(pstr+1)就一定能訪問到結構成員b。因為成員a和成員b之間可能會有若干填充字節,說不定*(pstr+1)就正好訪問到了這些填充字節呢。這也證明了指針的靈活性。要是你的目的就是想看看各個結構成員之間到底有沒有填充字節,嘿,這倒是個不錯的方法。
?
轉載于:https://www.cnblogs.com/kui0621/p/4064032.html
總結
以上是生活随笔為你收集整理的C语言指针学习(续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate框架学习之数据模型-P
- 下一篇: 第二次周总结