這幾天對c語言的指標溫習了下,感覺理解又更深入了一步
c語言的精髓是指標我想確實一點都不錯,但是在使用的時候有很多要注意的地方,大概總結一下:
1.指標指向常量區,是不能修改其值的
比如:char *p ="abcfd";
char *ptr ="abcfd";
*(p+1) ='c'; //此時會報錯,因為"abcfd"為常量區,其值是無法修改的
解決方法用字元陣列來解決
char p[100]="abcfd";
*(p+1) ='c';
char p[100]="abcfd"和char *p ="abcfd"在於前者為變數空間,可以簡單的理解為將"abcfd"這個常量在變數區做了乙份拷貝賦給陣列p[100]
後者則是直接將指標指向儲存於常量去的字串.
p和ptr則指向相同的記憶體位址
2.陣列名所代表的指標是無法修改的,因為其本身是乙個常量
比如:char p[100]="abcfd";
*(p++) ='c';//此時會報錯,因為p為常量,不能進行自加動作
3.指標陣列其儲存的值是同維度陣列的位址,而不是值
比如:int a[2][2]=,};
int (*p)[2]=a;
*(*p+1) 表示的a[0][1]
*(p+1) 表示的是a[1][0]的位址
*(p+1)[1] 表示的a[1][1]的位址
*p 表示儲存的a[0][0]
4.p 和 *p的區別
比如:int a=2;
int b=5;
int *p =&a;
*p =5;
*p = b;
p的值為儲存a的位址 *p表示以p裡儲存的位址所指向的記憶體的值 *p =5和*p = b則表示將p所指向的記憶體位址的值修改為5 或b
5.指標之間的算術運算是基於指標型別所定
比如:int a[5]=;
int *p,*q;
p=q =a;
p++;
p-q ==1//此時則為1
(char *)p -(char *)q ==4 //此時則為4
6.&array和array的區別
&array其所賦的指標為陣列指標 arra則表示的是指標
int a[5]=;
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1)); //輸出為2,5
int a[2][2]=;
int *ptr=(int *)(&a+1); //可以理解為將a的值加上乙個sizeof(int a)
printf("%d"*(ptr-1)); //輸出為4
&a+1不是首位址+1,系統會認為加乙個a陣列的偏移,是偏移了乙個陣列的大小(本例是5個int)
&a是陣列指標,其型別為 int (*)[5];
7.多級指標和多級陣列的概念相同
比如:int a[2][2]=;
*a表示的是一維陣列0所在的位址
*(a+1)表示的一維陣列1所在的位址
**a表示的是a[0][0]的值
*(a+1)[1]表示的是a[1][1]的值
8.指標型別和指標所指向的型別
指標的型別
你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。
(1)int*ptr;//指標的型別是int*
(2)char*ptr;//指標的型別是char*
(3)int**ptr;//指標的型別是int**
(4)int(*ptr)[3];//指標的型別是int(*)[3]
(5)int*(*ptr)[4];//指標的型別是int*(*)[4]
指標所指向的型別
當你通過指標來訪問指標所指向的記憶體區域資料 你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉,剩下的就是指標所指向的型別。
(1)int*ptr;//指標所指向的型別是int
(2)char*ptr;//指標所指向的的型別是char
(3)int**ptr;//指標所指向的的型別是int*
(4)int(*ptr)[3];//指標所指向的的型別是int()[3]
(5)int*(*ptr)[4];//指標所指向的的型別是int*()[4]
9.指標和陣列的初始化
指標可以在申明後,進行初始化
陣列必須在申明的時候進行初始化
比如:char *p="fds"; <--------> char *p; p ="fds";
char p[12];p=」visual c++」; 這樣賦值就是錯誤的,原因是p此時為常量的陣列名,為唯讀
10.陣列的&和不用&的區別
對陣列進行&運算表示的是取以陣列型別的指標,對其進行進一步運算的基礎以陣列型別為單位
而不用&直接運算元組名,只是取陣列成員
比如:char p="fdsf";
*(p+1) 則表示取'd『
11.指向陣列的指標,可以理解為二級指標,
比如:int a[4][2] =;
int (*p)[4];
p =a;
printf("%d",p[1][2]); //為7
printf("%d %d",p[1],*p[1]); //分別為5的位址和5
12.多維陣列的表示方式,可以理解為同等維度的指標
比如:static int b[3][2]=; //可以將b理解為int (*b)[2]
訪問具體元素的方式為 b[m][n],同樣可以為*(*(b+m)+n)
13.sizeof的區別
sizeof來測量指標,始終為4(根據具體字長) 《當指標作為形參傳入函式內部,其sizeof的值也固定為4,而不論指標型別》
還有很多要注意的地方,暫時先記在這,樓下的朋友可以進一步補充.
c語言 關於指標注意事項
使用指標變數作為函式引數時,只有在獲取位址的情況下對元素 p 進行操作,才能真正地修改變數。因為此時實參傳給形參,就是將堆上的申請的首位址傳給形參,這樣形參和實參都指向了堆上的記憶體,形參對堆上記憶體內容的修改,實參也是得到了修改。但是對傳入位址 p 進行操作是無法對原指標本身進行修改的。因為函式在...
C語言指標用法注意事項
計算機系統中有四個記憶體區域 1 棧 在棧裡面儲存一些我們定義的區域性變數以及形參 2 字元常量區 主要是儲存一些字元常量 3 全域性區 在全域性區里儲存一些全域性變數和靜態變數 4 堆 堆主要是通過動態分配的儲存空間,即以下講的講的動態分配記憶體空間。定義int型指標int p,p是用來儲存乙個位...
C語言注意事項
1 fgetc與fputc函式 fgetc函式從指定的文 件中讀乙個位元組 fputc 函式向指定的檔案寫乙個位元組 2 r 是回車,n 是換行,前者使游標到行首,後者使游標下移一格。c語言程式設計時 windows系統 r 就是return 回到 本行 行首 這就會把這一行以前的輸出 覆蓋掉 如 ...