請先看c++中的指標概述,這裡只是擴充
陣列指標
其實這裡主要說的就是c++中的指標運算
/*逆序陣列:把陣列中的內容前後對調陣列元素指標:
乙個變數有位址,乙個陣列包含若干個元素,每個陣列元素都有相應的位址,
指標變數可以指向陣列元素(把某一元素的位址放到乙個指標變數中)
所謂陣列元素的指標就是陣列元素的位址
可以用乙個指標變數指向乙個陣列元素
int a[10]=;
int *p;
p=&a[0]; 等同與 p=a; 等同與 int *p=a; 等同與 int*p=&a[0]
注意:1) 陣列名a不代表整個陣列,只代表陣列首元素的位址
p=a 的作用是"把a陣列的首元素的位址賦給指標變數p",而不是"把陣列a各個元素的值賦給p"
陣列指標:
指向陣列元素的指標
陣列指標的作用:
使用陣列指標間接訪問陣列的元素
陣列指標的定義:
int *p;
陣列指標的初始化;
int a[4] =;
int *p = a;//陣列指標,定義了乙個指標變數p賦值陣列的首位址(第乙個元素的位址),p指向陣列的第乙個元素
int *p = &a[0];//等價上面一句話
陣列指標如何訪問陣列的元素:
1) p+1 表示指向陣列的下乙個元素
2) p-1 指向陣列的上乙個元素
誤區:用陣列指標遍歷陣列
for(int i=0;i<4; i++)
//學習的誤區: 陣列名 a 是乙個常量 等同與 *(10++)
//陣列名++ 這是錯誤的
printf("*a=%d\n",*a++);//這種寫法是錯誤的
*/
void nixuarray(int a,int len);陣列名訪問二維陣列pa[0] a的位址
pa 陣列的首位址,又是變數a的位址
//使用陣列名來訪問 a的值
printf("%d\n",**pa);
int a1[2][2]=;
//定義了乙個指標陣列,賦值為a1[0]是第一行的指標
int *pa1[2]=;
printf("**pa1=%d\n",**pa1);
//*pa1 取到的是指標陣列pa1中首位址的值= a1[0]
//同時a1[0] = a1的首位址
*pa1 = a1[0]
printf("&a1[0] = %d\n",a1[0]);
printf("*pa1 = %d\n",*pa1);
//正推
//所以 **pa1 即 *(*pa1)=*(*pa1[0])=*(a1)=*(a1[0])=*(&(a1[0][0]))=a1[0][0] =1;
//**(pa1+1)=*(*(pa1+1))=*(*pa1[1])=*(a1[1])=*(&(a1[1][0]))=a1[1][0]=3
//逆推
//所以想拿數字2的時候 就相當於
2=a1[0][1]=*(&a1[0][1])=*(&a1[0][0]+1)=*(a1[0]+1)=*(a1+1)=*(*pa1[0]+1)=*(*pa1+1)
//拿數字3
3=a1[1][1]=*(&a1[1][1])=*(&a1[1][0]+1)=*(a1[1]+1)=*(pa1[1]+1)=*(*(pa1+1)+1)
公式 *(*(a+i)+j) == a[i][j]用普通指標訪問二維陣列
//這種寫法雖然也可以獲取到二維陣列中的元素,但是這樣寫是不符合規範的,利用了記憶體儲存的機制
資料在記憶體中存放的方式,從高位址依次向下存放
int a[3][4]=;二維陣列指標int *p=a
for(int i=0;i<12;i++)
一般形式:指標陣列和二維陣列指標變數的區別資料型別 (*指標變數名)[二維陣列列數];
其中"型別說明符"為所指陣列的資料型別. 「*」 標示其後的變數是指標型別
如要將二維陣列賦給一指標,應這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列
p=a; //將該二維陣列的首位址賦給p,也就是a[0]或 &a[0][0]
p++; //該語句執行過後,也就是p=p+1; p 跨過行a[0] 指向行a[1]
所以陣列指標也稱指向一維陣列的指標
遍歷二維陣列的元素
int a[3][4]=;
int (*p)[4]=a;
所以之前遍歷中的 陣列a 可以替換為 p :*(*(p+i)+j)
int *pa[3]=; pa是乙個指標陣列字串指標int *pa1[2]=
int (*pa)[3] ;//二維陣列指標
應該注入指標陣列和二維陣列指標變數的區別,這兩者雖然都可以用來標示二維陣列,但其表示方法和意義是不同的
二維陣列指標變數是單個的變數,其一般形式中(*指標變數名)兩邊的括號不可少,而指標陣列型別表示的是多個指
針(一組有序指標)在一般形式中"*指標陣列名"兩邊不能有括號.
例如:int(*p)[3]; //表示乙個指向二維陣列的指標變數,該二維陣列的列數為3或分解為一維陣列的長度為3
int *p[3]; //表示p是乙個指標陣列,有三個下標變數p[0],p[1],p[2]均為指標變數
char *變數名 ="字串內容" // "字串內容"是常量字串指標與字元陣列的區別//當指向的為'' 單引號時,為字元指標 ""雙引號時為字串指標
//字串指標 指向可以改變指標函式char *ss="abc";
ss="bcd";
//字元陣列
char s1="abc";
s1="hello" 這是錯誤的 可以改變裡面的內容但是不能重新指向
乙個函式的返回值型別是指標,我們就稱為指標函式函式指標格式:型別說明符 * 函式名( 形參表)
例://返回兩個數中的大數的位址
//返回的是形參x 和 y 中大數的位址
int * max( int x,int y)
函式指標在c語言中,乙個函式總是占用一段連續的記憶體區,而函式名就是該函式所佔記憶體區的首位址。
我們可以把函式的這個首位址(或稱入口位址)賦予乙個指標變數,使該指標變數指向該函式.然後通過指標變數就可以找到並呼叫這個函式.我們把這種指向函式的指標變數稱為"函式指標變數"
函式指標定義方法:
函式指標變數定義的一般形式為:
型別說明符 (*指標變數名)(函式的引數);
其中"型別說明符" 表示被指函式的返回值的型別
"(* 指標變數名 )" 表示 "*" 後面的變數是定義的指標變數
函式的宣告:
int sum(int a,int b);----->函式指標 int (*p)(int a,int b);
//定義了乙個函式指標p
//p可以存放返回值是int型別, 並且有兩個形參,形參的型別還都是int型別的函式的位址
//函式指標的初始化
p = sum;//sum存得就是函式在記憶體中的首位址
//定義函式指標的時候,可以不用寫形參名
int (*p)(int int);
函式指標的使用
1.定義函式指標
int(*p) (int int);
2.給函式指標初始化
p=sum;
3.用函式指標間接的呼叫函式
int s=p(23,45);
函式指標的用處:
例如 + - x /時 ,只需要判斷符號 ,然後 p = sum / p = jian 就可以
C 語言中的指標
指標是 c 語言中的精華,正確靈活的運用指標,可以表示複雜的資料結構,動態分配記憶體,方便使用字串和陣列,呼叫函式返回多結果,直接處理記憶體單元等等。位址就是記憶體的編號,如果拿旅店作為記憶體,那麼每個房間號其實就相當於位址了。當程式編譯時,就會對變數分配記憶體單元,分配時按變數型別分配大小。經過編...
C語言中的指標
隨著程式語言的越來越多,但c語言在程式語言中的地位似乎始終沒有改變,其中得益於c語言中的指標,可以直接去操作記憶體位址與暫存器,執行效率也高,在嵌入式領域運用得尤其廣泛。對於初學者來說指標是c語言中很難翻越的一座大山,指標的掌握程度直接關係到c語言的掌握程度,其實指標並不是那麼高不可攀,只是紙老虎而...
C語言中的指標
指標是c語言中非常重要的東西,書本上寫了好多來解釋裡面的原理,當年老師也跟我們講了好多這方面的東西,一直就是感覺沒有聽明白。直到我看到了指向指標的指標,我建立了自己的理解,不知道是否正確,但是基本能解決遇到的問題。int p p i p。type p,宣告指標變數,type 例如int 告訴計算機p...