数组和指针、数组指针和指针数组
生活随笔
收集整理的這篇文章主要介紹了
数组和指针、数组指针和指针数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include?<iostream>?? using?namespace?std;?? ?? void?tArray1(int?*p)?? {?? ????for?(int?i?=?0;?i?<?3;?i++)?? ????{?? ????????*(p+i)?=?*(p+i)+1;?? ????????cout?<<?*(p+i)?<<?endl;?? ????}?? }?? ?? void?tArray2(int?a[])?? {?? ????for?(int?i?=?0;?i?<?3;?i++)?? ????{?? ????????a[i]?=?a[i]?+?1;?? ????????cout?<<?a[i]?<<?endl;?? ????}?? }?? ?? void?tFunc1(void?(*f)())?? {?? ????(*f)();?? }?? ?? void?func1()?? {?? ????cout?<<?"hello?world"?<<?endl;?? }?? ?? float?*find(float?(*ptr)[4],int?n)?? {?? ????float?*pt;?? ????pt?=?*(ptr?+?n);?? ????return?(pt);?? }?? ?? void?main()?? {?? ????/****************?指針和數組的關系***********************/?? ????//對指針可以直接進行下標檢索操作,這時把指針當前空間作為數組首元素進行操作,自己進行越界檢查?? ????//這個時候解引用運算符和下標運算符檢索效果是相同的??? ????/*int?a[3]?=?{1,2,3};?? ????cout?<<?a?<<endl;?? ????cout?<<?*a?<<?endl;?? ????cout?<<?a[10]?<<?endl;//需要自己進行越界檢查?? ????//a++;//編譯報錯,因為數組標識符是一個只讀指針不能改變其值,如果要通過指針遍歷要通過把它傳給其他指針進行?? ????int?*ptr?=?a;?? ????cout?<<?ptr?<<?endl;?? ????cout?<<?ptr[0]?<<?endl;?? ????cout?<<?ptr[1]?<<?endl;?? ????cout?<<?*ptr?<<?endl;?? ????ptr++;?? ????cout?<<?ptr?<<?endl;?? ????cout?<<?*ptr?<<?endl;?? ????cout?<<?ptr[1]?<<?endl;//這個時候把ptr當前位置作為數組的第一個元素?? ????cout?<<?ptr[10]?<<?endl;//需要自己進行越界檢查?? ?? ????int?c?=?10;?? ????int?*p?=?&c;?? ????cout?<<?p[0]?<<?endl;?? ????//p[1]?=?16;?//編譯報錯,越界訪問?? ????cout?<<?p[1]?<<?endl;//這個時候就是一個不可預知的值了,需要自己進行越界檢查,實際就是p的下一個四字節單元存儲的值?? ????cout?<<?endl;*/?? ?? ????/**************************指針數組和數組指針*********************************/?? ????/*int?arrInt1[3]?=?{1,2,3};?? ????int?arrInt2[3]?=?{4,5,6};?? ????int?arrInt3[3]?=?{7,8,9};?? ?? ????int?*p[3];//根據運算符優先級相當于int?*(p[3]);p是一個數組,數組元素存儲指針類型,指針是int類型的(指針數組)?? ????p[0]?=?arrInt1;?? ????p[1]?=?arrInt2;?? ????p[2]?=?arrInt3;?? ????cout?<<?*p[0]?<<?"+++"?<<?*p[1]?<<?"+++"?<<?*p[2]?<<?endl;?? ?? ????int?(*ptr)[3];//這個時候使用()進行了運算符優先級強制限制,ptr是一個指針,指針是int?[3]類型的(數組指針,而且十分嚴格)?? ????//ptr?=?arrInt1;?//編譯報錯,因為類型不一致,且編譯器不做自動轉換?? ????ptr?=?&arrInt1;//意義就是取這個數組的首地址,和arrInt1是數值相同的,&arrInt1取得的是一個int?[3]類型的指針,即int?(*)[3]?? ????cout?<<?arrInt1?<<?endl;?//取得的是數組的首地址,但是這個時候的類型是int?[3]?? ????cout?<<?ptr?<<?endl;?? ????cout?<<?ptr[0]?<<?endl;?? ????cout?<<?*ptr?<<?endl;//取得的是它指向的那個數組的首地址?? ????cout?<<?*ptr[0]?<<?endl;?? ????cout?<<?ptr[1]?<<?endl;//實際上是取得下一個int?[3]數組的地址?? ????cout?<<?*(ptr+1)?<<?endl;?? ????cout?<<?*(ptr[0]+1)?<<?endl;?? ?? ????int?*p1;?????//雖然arrInt2是int?[3]類型的,但是編譯器/c++標準允許將其首地址轉換為一個int?*類型?? ????//p1?=?&arrInt2;?//編譯報錯,編譯器不做這種類型自動轉換,把?? ????p1?=?arrInt2;?? ????cout?<<?p1?<<?endl;?? ????cout?<<?p1[0]?<<?endl;?? ????cout?<<?*p1?<<?endl;*/?? ?? ????/**********數組做參數,實際上傳入的都是指針*************/?? ????/*int?array[3]?=?{1,2,3};?? ????int?*pArray?=?array;?? ????tArray1(pArray);?? ????tArray2(array);?? ????for?(int?j?=?0;?j<3;?j++)?? ????{?? ????????cout?<<?array[j]?<<?endl;?? ????}*/?? ?? ????/********函數指針(指向函數的指針)?和?指針函數(函數返回值是指針)*******************************************/?? ????//小結:關于一個變量是什么類型的判斷要根據運算符優先級和結合性來判斷,()、[]優先級高于*,()、[]是從左?? ????//向右運算,*是從右向左運算。?? ????//跟變量第一個結合的運算符決定了變量的性質;如果是指針要判斷是存儲那種數據類型的地址,如果是數組?? ????//就要判斷數組中存儲那種類型的元素,去掉變量之后剩下的數據類型就是其所要存儲的地址類型或者元素類型?? ????//例如:void?*p(int)這個時候p就是函數,去掉p(int)之后剩下的是void*就是說這個函數返回值是void*類型的;?? ????//void?(*p)(int)這個時候p就是指針,去掉(*p)之后剩下void?(int)就是說它存儲的是一個執行返回值為void有一個類型?? ????//為int的參數的函數的地址;char?*p[3],這個時候p就是數組,去掉p[3]之后剩下的是char?*即是說這個數組中存儲的?? ????//元素的數據類型是char*的;char?(*p)[3]這個時候p就是指針,去掉(*p)剩下的是char?[3]就是說p存儲的是一個?? ????//char?[3]數組的首地址。復雜的也是從內向外依次拆解?? ????/*?? ????void?(*pFunc)();?? ????pFunc?=?func1;?? ????(*pFunc)();?? ????tFunc1(func1);?? ?? ????float?score[][4]?=?{{60,70,80,90},{56,89,34,45},{34,23,56,45}};//靜態創建的時候是開辟了一塊連續的空間?? ????cout?<<?sizeof(float)?<<?endl;?? ????cout?<<?score?<<?endl;???//其實這里score就是存儲二維數組的每一行的首地址的一個數組的首地址?? ????cout?<<?score+1?<<?endl;?? ????int?m;?? ????cin?>>?m;?? ????float?*p?=?find(score,m);?? ????for?(int?i?=?0;?i?<?4;i++)?? ????{?? ????????cout<<?(*(p+i))?<<?endl;?? ????}*/?? ?? ????/***************動態和靜態創建的高維數組及數組標識符的含義及類型*******************************/?? ????/*?? ????//小結:其實n維數組(靜態創建的數組),它的標識符其實就是最高維(從整體看來第n-1維數組)的首地址?? ????//例如:tri三維數組而言,{{1,2},{3,4}}和{{5,6},{7,8}}是第n-1維數組,它們共同構成了一個三維數組,?? ????//其實tri就是這兩個二位數組的首地址構成的數組的首地址?? ????//靜態創建的數組本質上還是一塊連續存儲的區域?? ????int?tri[2][2][2]?=?{{{1,2},{3,4}},{{5,6},{7,8}}};?? ????//int?(**pt)[2]?=?tri;//編譯會報錯,因為tri本質上是一個一維數組的首地址,元素是二位數組的首地址?? ????int?(*pt)[2][2]?=?tri;?? ????cout?<<?tri?<<?endl;?? ????cout?<<?tri[0]?<<?endl;?? ????cout?<<?pt?<<?endl;?? ????cout?<<?tri?+?1?<<?endl;?? ????cout?<<?tri[1]?<<?endl;?? ????cout?<<?pt?+?1?<<?endl;?? ?? ????//而動態創建的多維數組跟靜態創建的數組從結構而言就不是一個概念?? ????//動態創建的數組各維之間的關系通過上一維中存儲的地址來聯系,所以不能使用++來就按下一維的地址?? ????int?m,n,p;?? ????int?i?=?1;?? ????int?***pTri;?? ????pTri?=?new?int?**[2];?? ????for?(m?=?0;?m<2;?m++)?? ????{?? ????????pTri[m]?=?new?int?*[2];?? ????}?? ????for?(m?=?0;?m?<?2;?m?++)?? ????{?? ????????for?(n?=?0;?n?<?2;?n++)?? ????????{?? ????????????pTri[m][n]?=?new?int[2];?? ????????}?? ????}?? ????for?(m?=?0;?m<?2;?m++)?? ????{?? ????????for?(n?=?0;?n<2;?n++)?? ????????{?? ????????????for?(p=0;?p<2;?p++)?? ????????????{?? ????????????????pTri[m][n][p]?=?i;?? ????????????????i++;?? ????????????}?? ????????}?? ????}?? ?? ????for?(m?=?0;?m<?2;?m++)?? ????{?? ????????for?(n?=?0;?n<2;?n++)?? ????????{?? ????????????for?(p=0;?p<2;?p++)?? ????????????{?? ????????????????cout?<<?pTri[m][n][p]?<<?endl;?? ????????????}?? ????????}?? ????}?? ????cout?<<?pTri?<<?endl;?? ????cout?<<?pTri[0]?<<?endl;?? ????cout?<<?pTri?+?1?<<?endl;?? ????cout?<<?pTri[1]?<<?endl;*/?? }??
數組和指針、數組指針和指針數組、函數指針和指針函數、數組標識符的意義、靜態和動態創建的數組的本質區別、標識符類型判斷方法
??????????? [html] view plaincopyprint?總結
以上是生活随笔為你收集整理的数组和指针、数组指针和指针数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NAL的基本特征
- 下一篇: linux下gdb单步调试