c語言指標注意事項

2021-06-04 02:44:53 字數 2931 閱讀 5488

這幾天對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 回到 本行 行首 這就會把這一行以前的輸出 覆蓋掉 如 ...