第五章 数组和指针的关系
生活随笔
收集整理的這篇文章主要介紹了
第五章 数组和指针的关系
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如果對聲明數組的語句不太明白的話,請參閱我前段時間貼出的文章<<如何
理解c和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],但如果把a
rray看做指針的話,它指向數組的第0個單元,類型是int?*,所指向的類型是數
組單元的類型即int。因此*array等于0就一點也不奇怪了。同理,array+3是一個
指向數組第3個單元的指針,所以*(array+3)等于3。其它依此類推。
例九:
?????????char?*str[3]={
????????????????????????"Hello,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));
?????????strcpy(s,str[2]);//也可寫成strcpy(s,*(str+2));
????上例中,str是一個三單元的數組,該數組的每個單元都是一個指針,這些指
針各指向一個字符串。把指針數組名str當作一個指針的話,它指向數組的第0號
單元,它的類型是char**,它指向的類型是char?*。
????*str也是一個指針,它的類型是char*,它所指向的類型是char,它指向的地
址是字符串"Hello,this?is?a?sample!"的第一個字符的地址,即'H'的地址。
????str+1也是一個指針,它指向數組的第1號單元,它的類型是char**,它指向
的類型是char?*。
????*(str+1)也是一個指針,它的類型是char*,它所指向的類型是char,它指向
"Hi,good?morning."的第一個字符'H',等等。
????下面總結一下數組的數組名的問題。聲明了一個數組TYPE?array[n],則數組
名稱array就有了兩重含義:第一,它代表整個數組,它的類型是TYPE?[n];第二
,它是一個指針,該指針的類型是TYPE*,該指針指向的類型是TYPE,也就是數組
單元的類型,該指針指向的內存區就是數組第0號單元,該指針自己占有單獨的內
存區,注意它和數組第0號單元占據的內存區是不同的。該指針的值是不能修改的
,即類似array++的表達式是錯誤的。
????在不同的表達式中數組名array可以扮演不同的角色。
????在表達式sizeof(array)中,數組名array代表數組本身,故這時sizeof函數
測出的是整個數組的大小。
????在表達式*array中,array扮演的是指針,因此這個表達式的結果就是數組第
0號單元的值。sizeof(*array)測出的是數組單元的大小。
????表達式array+n(其中n=0,1,2,....。)中,array扮演的是指針,故arr
ay+n的結果是一個指針,它的類型是TYPE*,它指向的類型是TYPE,它指向數組第
n號單元。故sizeof(array+n)測出的是指針類型的大小。
例十:
?????????int?array[10];
?????????int?(*ptr)[10];
?????????ptr=&array;
????上例中ptr是一個指針,它的類型是int?(*)[10],他指向的類型是int?[10]
,我們用整個數組的首地址來初始化它。在語句ptr=&array中,array代表數組本
身。
????本節中提到了函數sizeof(),那么我來問一問,sizeof(指針名稱)測出的究
竟是指針自身類型的大小呢還是指針所指向的類型的大小?答案是前者。例如:
??????????int?(*ptr)[10];
????則在32位程序中,有:
??????????sizeof(int(*)[10])==4
??????????sizeof(int?[10])==40
??????????sizeof(ptr)==4
????實際上,sizeof(對象)測出的都是對象自身的類型的大小,而不是別的什么
類型的大小。
理解c和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],但如果把a
rray看做指針的話,它指向數組的第0個單元,類型是int?*,所指向的類型是數
組單元的類型即int。因此*array等于0就一點也不奇怪了。同理,array+3是一個
指向數組第3個單元的指針,所以*(array+3)等于3。其它依此類推。
例九:
?????????char?*str[3]={
????????????????????????"Hello,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));
?????????strcpy(s,str[2]);//也可寫成strcpy(s,*(str+2));
????上例中,str是一個三單元的數組,該數組的每個單元都是一個指針,這些指
針各指向一個字符串。把指針數組名str當作一個指針的話,它指向數組的第0號
單元,它的類型是char**,它指向的類型是char?*。
????*str也是一個指針,它的類型是char*,它所指向的類型是char,它指向的地
址是字符串"Hello,this?is?a?sample!"的第一個字符的地址,即'H'的地址。
????str+1也是一個指針,它指向數組的第1號單元,它的類型是char**,它指向
的類型是char?*。
????*(str+1)也是一個指針,它的類型是char*,它所指向的類型是char,它指向
"Hi,good?morning."的第一個字符'H',等等。
????下面總結一下數組的數組名的問題。聲明了一個數組TYPE?array[n],則數組
名稱array就有了兩重含義:第一,它代表整個數組,它的類型是TYPE?[n];第二
,它是一個指針,該指針的類型是TYPE*,該指針指向的類型是TYPE,也就是數組
單元的類型,該指針指向的內存區就是數組第0號單元,該指針自己占有單獨的內
存區,注意它和數組第0號單元占據的內存區是不同的。該指針的值是不能修改的
,即類似array++的表達式是錯誤的。
????在不同的表達式中數組名array可以扮演不同的角色。
????在表達式sizeof(array)中,數組名array代表數組本身,故這時sizeof函數
測出的是整個數組的大小。
????在表達式*array中,array扮演的是指針,因此這個表達式的結果就是數組第
0號單元的值。sizeof(*array)測出的是數組單元的大小。
????表達式array+n(其中n=0,1,2,....。)中,array扮演的是指針,故arr
ay+n的結果是一個指針,它的類型是TYPE*,它指向的類型是TYPE,它指向數組第
n號單元。故sizeof(array+n)測出的是指針類型的大小。
例十:
?????????int?array[10];
?????????int?(*ptr)[10];
?????????ptr=&array;
????上例中ptr是一個指針,它的類型是int?(*)[10],他指向的類型是int?[10]
,我們用整個數組的首地址來初始化它。在語句ptr=&array中,array代表數組本
身。
????本節中提到了函數sizeof(),那么我來問一問,sizeof(指針名稱)測出的究
竟是指針自身類型的大小呢還是指針所指向的類型的大小?答案是前者。例如:
??????????int?(*ptr)[10];
????則在32位程序中,有:
??????????sizeof(int(*)[10])==4
??????????sizeof(int?[10])==40
??????????sizeof(ptr)==4
????實際上,sizeof(對象)測出的都是對象自身的類型的大小,而不是別的什么
類型的大小。
轉載于:https://www.cnblogs.com/jhjh/archive/2011/06/12/2079219.html
總結
以上是生活随笔為你收集整理的第五章 数组和指针的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸿蒙2对比鸿蒙3:华为把老机器奶活了
- 下一篇: Intel Arc显卡可以交火吗?可以