此文為指標系列第二篇:
c語言精要總結-指標系列(一)
c語言精要總結-指標系列(二)
前面提到過指標的解引用運算,除此之外,指標還能進行部分算數運算、關係運算
指標能進行的有意義的算術運算包括加減法運算,但不包括乘除運算。並且運算存在諸多限制。
加法運算
指標加法運算只適合指標與整數,不能用在指標與指標。
指標加上或者減去乙個整數n,是儲存的位址值加上或者減去n*指標指向型別的空間大小。也就是
結果指標 = 指標 ± n * 指標指向型別空間大小。
例如int型別的整數指標+1,運算結果依然是乙個整型指標,其儲存的位址值為原指標值+1*4,這是因為整型變數占用4個位元組的空間。這個計算結果,恰好在當前指標指向基礎上,向下偏移指向下乙個相同型別的空間。如下圖
指標與整數的加減法一般用在迭代連續的記憶體空間-陣列,如果運算得到的指標指向第乙個元素之前或者最後乙個元素之後,可能會產生非法讀寫記憶體中斷,就像引用乙個未初始化的指標一樣不可預知。
指標除了可以與整數做加減運算,連個指標之間還可以做減法運算(不能做加法運算)且必須是同型別的指標。運算結果為兩個指標指向位址之間,可以存放多少此型別的變數數(或其相反數),型別為ptrdiif_t型別(一種有符號整數型別)。
1如上程式將輸出-3,也如上圖所示,這3個空間存放著 10、80、6三個整型變數。int * p1 = (int *) 0x100;2
int * p2 = (int *) 0x10c
;3 printf("
p2-p1 : %d\n
",p1 - p2); // -3
指標與指標相減,一般也用在連續位址空間-陣列中。此時兩個指標相減跟下標索引相減是等價的。
1常量指標表示通過此指標,不能修改其指向的記憶體區域的內容,指標本身的值是可以修改為指向另乙個變數,雖然可以修改指向另乙個變數,但是依然不允許修改指向變數裡的內容。常量指標一般用在函式一些函式引數中,以唯讀的方式傳遞函式引數。這裡說明一點c語言除了巨集定義常量和列舉之外,是不能定義普通常量的,只可用const定義唯讀變數,而常量指標指向的是就是乙個唯讀變數。唯讀變數是不能修改的變數。int arr[5
] ;2 printf("
%d\n
",&arr[4] - &arr[0] == 4 - 0); //
1
1而指標常量表示指標本身的內容不可變(指向不可變),因此,定義指標常量時必須同時初始化乙個位址值。const
int readonlyvar = 10;2
int * provar = (int *) &readonlyvar;
3 * provar = 11
;4 printf("
%d\n
",readonlyvar);
定義指標常量和定義常量指標的方式區別在於const關鍵字的位置
int以*號為界限,看cosnt修飾的是誰,如果修飾的是型別關鍵字,表示指向常量型別——常量指標,如果修飾的是指標識別符號,表示指標常量。顯然p1、p2是常量指標,p3是指標常量,p4既是常量指標,又是指標常量。const *p1 ;
const
int *p2 ;
int * const p3 =null;
const
int * const p4 = null;
指標陣列指元素由指標組成的陣列,一般用在儲存字串組,例如下面的程式
1此時指標陣列前三個成員指向靜態區的三個字串常量,而後兩個指標被預設初始化為0(null)char * options[5] =;
6for (i = 0 ; i < 5 ;i ++)
711 }
c語言**現的字串字面量,實際是儲存在靜態資料區的字串常量。當乙個字串出現在c語言表示式中,其實際值是乙個指標常量。如下面宣告乙個指標常量的**
char * str = "可以用另一段**來描述,即先在某處為字串分配空間,記錄指向第乙個字元的乙個指標常量,並將字元拷貝進去。**如下hello
";
char * const strbuff = (char * ) malloc (6既然明確字串常量在**中實際是乙個指標常量,因此其也可以參與運算。**如下);strcpy(strbuff,
"hello");
char * str =strbuff;
free(strbuff);
printf("常量指標「hello」+1後得到乙個新的指標,按指標運算的規則將指向下乙個e,所以以字串形式輸出ello%c\n
",* "
hello
"); //
hprintf("
%s\n
", "
hello
" + 1);//
ello
除此之外指標輸在還用在處理許多多維陣列的地方,這在後續的章節中會提到。
常量指標陣列表示元素都指向常量的陣列。定義方式如下
1當然,這裡的例子,const加與不加沒太大區別,因為即便不加const關鍵字,options中的每乙個元素依然是指向乙個字串常量,是不能修改的。例如要將「--list」中的第2個『-』換成'+'號,下面的**是行不通的,方法只有讓指標指向乙個全新的字串常量(因為是常量指標,所以指標本身的內容可以修改)const
char * options[5] =;
* (options[0] + 1) = '加上const的好處是,讓編譯器或者ide工具在執行之前便告知你此類**存在的問題。關於字串常量,下面的異常**可能更易懂一些+';
char * str = "指標常量陣列表示每個指標元素都是不可修改的(指向固定了),但是其指向內容,視情況是可以修改的。hello";
*(str + 3) = '
w';
1當然,因為字串常量的緣故,上面的**定義了乙個指標元素、指標元素指向區域內都不可變的指標陣列。例如,像下面的**都是非法的char * const options[5] =;
1 options[0] = tmpstr; //下一系列將用一兩個複雜的案例詳細講解指標與陣列的關係。修改指標指向新的字串常量
2 *(options[0]) = '
+'; //
修改第乙個元素指向區域的內容
C語言指標系列
從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部 分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各 個指標的型別 1 int ptr 指標的型別是 int 2 char ptr 指標的型別是 char 3 int ptr 指標的型別是 int 4 int ptr 3 ...
C語言系列筆記 指標
指標變數的本質是用來放位址的,而一般的變數是放數值的。例題 int p a p a 請問p 和 p 的數值分別為多少?p 這個本身的數值為1,由於是位址會增加1,所以指標指向數值3了。p 這個本身的數值為1.由於有個 表示數值會增加,指標不移動,但數值1由於自加了一次變成2。例題 int x 7 i...
C語言指標總結
2012 03 07 07 22 標籤 c語言 分類 pointer c語言中的精華是指標,這也是c語言中唯一的難點。c是對底層操作非常方便的語言,而底層操作中用到最多的就是指標,以後從事嵌入式開發的朋友們,指標將陪伴我們終身。1.指標型別分析 分析指標,可以從變數名處起,根據運算子優先順序結合,一...