最近因為考研所以需要去看資料結構,自己就打算先把c語言過一遍,這幾天複習了一下c語言的指標,當時學的時候這部分沒有深刻理解,現在把自己最近看的總結在下面:
資料在記憶體中的儲存
指標和陣列的關係
在宣告陣列時,編譯器根據宣告所指定的元素的個數以及型別為陣列分配記憶體空間,並將陣列名與陣列的起始位址和所佔記憶體位元組數等資訊相關聯。所以通過陣列名可以直接獲取陣列所佔記憶體位元組數,例:int a[10];//可通過sizeof(a)獲取所佔記憶體位元組數
同時也可以獲得指向該陣列下表為0的元素的指標,陣列名a就是指向陣列a[0]的指標。
int a[100],*ptr;ptr=a;
則關於第i個元素的引用方法有以下四種:
陣列作函式引數的本質
陣列名在引數傳遞時,總是被視作指標,陣列本身並沒有複製,減少了引數傳遞的代價。
int sum(int arr);//實際上等價於int sum(int *arr);
如果要計算陣列a[2]後面三個元素的和,可以呼叫sum(a+2);
去計算。
字串常量
c語言把字串常量作為字元陣列來處理。對於長度為n的字串常量,編譯器會為其分配長度為n+1的記憶體空間,用來儲存這n個字元,以及乙個用來標識字串末尾的空字元。空字元佔乙個位元組,所有位都為0,用轉義序列『\0』來表示。
既然字串常量作為陣列來儲存,所以編譯器會將其看成char *型別的指標,由指向首字元的指標和字串結束標誌『\0』就可以唯一確定乙個字串。
char *p;p="abcd";
用字串為字元指標賦值,指的是將char*型別的指標存入變數p,編譯器首先為字串常量"abcd"分配記憶體空間,然後將該記憶體的首位址存入p。
"abcd"字串常量在編譯器看來是指向首字元『a』的指標。所以可以有如下運算printf("%s","abcd"+1);//輸出為bcd
,同時c語言允許對指標進行下標運算,因此可以進行如下運算char ch="abcd"[2];//ch='c'
字元陣列與字元指標
char *sp="hello world";
char sa="hello world";
字元陣列和字元指標變數都可以用作字串,但是二者不等價。對於sp指向記憶體中常量區的字串"hello world",字串的內容不能改變。而sa是乙個字元陣列,系統首先為陣列分配足夠的記憶體空間,然後把"hello world"中的字元逐個存入陣列,並新增』\0』,內容可以改變。
所以對於sp[0]='a';//不合法 而sa[0]='a'合法
四種不同型別的指標
變數在使用前必須被定義且安排好儲存空間。全域性變數、靜態區域性變數的儲存空間是在編譯時確定,在程式開始執行前完成。函式引數,區域性變數實在執行函式或進入變數定義所在的復合語句時為它們分配儲存空間,變數的大小也是靜態確定的。
但是有時需要在程式執行時動態分配記憶體,這一功能只能通過指標來實現。在程式執行期間,存放函式的引數值、區域性變數的記憶體區域由系統自動分配和釋放,稱為棧,而由程式設計師分配釋放的記憶體區稱為堆。
ok,先到這把,接下來會看c語言的結構,然後再進行總結,每次總結相當於一次解釋,重新加深印象,考研加油,生活繼續。
c語言指標詳解
一.指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。1.指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部...
C語言指標詳解
類似於 int p char p 或者自定義型別的 person p struct p 這些都是基本的指標變數,不管什麼型別的指標變數都是乙個存位址的變數,所以它們的大小都是四個位元組 還有一種void p 型別,類似於 js 或者 c 的 var 可以傳入任何型別變數的位址,也可以轉換成任何型別變...
C語言指標詳解
c語言指標應用 一 指標是什麼 指標是乙個特殊的變數,它存的是記憶體裡的乙個位址。指標四要素 1.指標的型別 把指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別如下 1 int p 指標的型別是int 2 char p 指標的型別是char 3 int p 指標的型別是int 4...