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